在很多时候我们想要在程序中存储想要的信息,但是又不知道该信息的大小或者说不知道需要多长的数组来存放。动态分配空间这个很好的解决了这个问题,动态分配不仅只可以用在链表中分配节点空间,其实更多时候用来分配数组的空间。今天我记录的这个代码就是一次性分配好信息所需要的空间大小。
假设: 现在我有一个txt文件存放着非常多得单词,我想要把这些文本中的单词存放进我的顺序表中。假设现在想不出很好的方法,只想到用一个二维字符数组来存放这些单词。(当然方法很多不仅限于我这个)
首先我们需要明确几个前提工作:
第一:我们需要知道文件中这些单词有几个 ,目的是为了后面申请存放多少个单词空间做准备 (这里有一个我之前写过的包含很多对文件内容的操作,里面就包含了计算单词个数的多少***************就是比较粗糙,没做什么解释http://t.csdn.cn/vh1Tm***************************,你也可以等下直接看我后面放的代码。)
第二:因为我们用的是二维数组,需要保证所有单词都有足够空间存下该单词长度 ,这时候就用上了之前我在博客里面写到的函数功能,里面写的比较详细这里就不展开了http://t.csdn.cn/KZBa6 知道长度后就是为后面申请空间做准备,因为知道了最长的那个单词长度了,只要保证能装得下最长的单词,其他的也就自然装得下。
第三:准备工作完成后就到了我们的目的了,把文件中的单词存放进刚刚申请出来的空间里面。
下面是代码:
#include#include #include #include //该头文件包含isalpha()这个函数 int F_link_len,F_maxword_len; typedef struct _Elem{ char *word;//存放单词 }Elem; typedef struct _Elemlink{ Elem *array;//动态定义数组 int link_len;//数组长度 }Elemlink; char temp[50]; //辅助功能,用来临时存放最长的单词,因为在函数内部定义想要返回数组就会造成内存泄漏 Elemlink *Sqlink_Firefox = NULL; int main(void) { int i; FILE *fp1 = NULL; FILE *fp2 = NULL; char ch; Sqlink_Firefox = (Elemlink*)malloc(sizeof(Elemlink));//建立一个顺序表的空间 ,地址是全局变量,出了函数后也不会被释放 fp1 = fopen("D:/单词文件.txt","r"); F_link_len = count_to_words(fp1);//统计单词表 接收单词数量 Sqlink_Firefox->array = (Elem*)malloc(sizeof(Elem)*F_link_len);//分配顺序单词表空间 fclose(fp1); fp1 = fopen("D:/单词文件.txt","r"); F_maxword_len = sizeof(Find_MAXword(fp1)) + 1;//找到单词表中最长单词的长度 ,加一方便后面分配空间时需要把 填进去 fclose(fp1); for(i = 0; i < F_link_len; i++) { Sqlink_Firefox->array[i].word = (char*)malloc(sizeof(char)*F_maxword_len+1); //分配每个单词的空间,用最大长度的单词空间就能存下所有的 } fp1 = fopen("D:/单词文件.txt","r"); saveword_to_Sq(Sqlink_Firefox, fp1); fclose(fp1); printf("打印存放进顺序表的单词:n") for(i = 0; i < F_link_len; i++) { printf("%s ", Sqlink_Firefox->array[i]); } return 0; } int count_to_words(FILE *fp)//统计删除后的单词个数 { char ch; int nums = 0; while(!feof(fp)) { ch = getc(fp); if(isalpha(ch)) { nums++; while(1) { ch = getc(fp); if(!isalpha(ch)) break; } } } return nums; } char *Find_MAXword(FILE*fp) { char long_word[50];//存放最长的单词 char ch; int n = 0, len = 0, i; while(!feof(fp)) { ch = fgetc(fp); if(isalpha(ch)) { long_word[n++] = ch; } else if(!isalpha(ch)) { long_word[n] = ' '; if(len <= n - 1)//判断是否遇到比之前最长的单词还要长 ,通过n来判断 { len = n;//把比之前最长的那个单词长度替换成现在比他长的 strcpy(temp, long_word);//存放目前找到的最长单词 } n = 0; for(i = 0; i < 50; i++)//用空格清空存放的字符串,继续存放下一个 { long_word[i] = ' '; } } } return temp; } void saveword_to_Sq(Elemlink *Sqlink, FILE *fp1) { char ch; int index = 0, n = 0, start = -1; while(!feof(fp1)) { ch = fgetc(fp1); if(isalpha(ch)) { if(isupper(ch)) { ch = tolower(ch); } start = 1; Sqlink->array[index].word[n] = ch; n++; } else if(start == 1) { start = -1; Sqlink->array[index].word[n] = ' ';//变成字符串单词 index++; n = 0; } } }



