Arrays 没有字符串数组,并使用“0”;堆已损坏";
这个C程序读取每行一个字的文件。我想计算文件的唯一字数并将其存储在totalwords中,totalwords通过调用函数的引用传递。 程序创建一个字符串数组来存储已经读取的单词。 还有另一个非常简单的函数,它检查字符串数组中是否已经包含一个单词,称为isContained(),请参见本文末尾。 所有这些似乎都正常工作,我甚至检查了这些单词是否作为唯一的单词一致地存储在数组中。但是,释放阵列时会出现错误“堆已损坏”,程序会崩溃。 很抱歉,如果这是一个新手问题,但我仔细检查了一下,找不到错误所在 提前多谢 评论后所做的更正(很抱歉,我必须清理原始代码的某些部分以发布示例): @一些程序员伙计,@Ryker,@kiran biradar,@mlp:我删除了重复的行声明,并在末尾添加了空闲(行)。我还为字符串终止保留了空间。numrecords已被删除(这是为了澄清而删除的原始代码的一部分)。我使用的是Visual Studio 2019,调试模式下没有出现错误,只有4条警告。可能我做错了什么。 已删除sizeof(字符) 谢谢大家。我再次检查。这是由于没有附加终止字符的字符串的另一个malloc。问题已解决。 多谢各位Arrays 没有字符串数组,并使用“0”;堆已损坏";,arrays,c,string,free,Arrays,C,String,Free,这个C程序读取每行一个字的文件。我想计算文件的唯一字数并将其存储在totalwords中,totalwords通过调用函数的引用传递。 程序创建一个字符串数组来存储已经读取的单词。 还有另一个非常简单的函数,它检查字符串数组中是否已经包含一个单词,称为isContained(),请参见本文末尾。 所有这些似乎都正常工作,我甚至检查了这些单词是否作为唯一的单词一致地存储在数组中。但是,释放阵列时会出现错误“堆已损坏”,程序会崩溃。 很抱歉,如果这是一个新手问题,但我仔细检查了一下,找不到错误所在
int fileProcessing(char* file_in, int* totalwords) {
FILE* streamVec;
char* line = malloc(200);
int i=0;
int numberoflines=1000;
char** currentList = malloc(numberoflines* sizeof(char*));
int linelength = 500; //arbitrary value to assure that lines are read completely
streamVec = fopen(file_in, "r");
if (streamVec == NULL) {
printf("*** ERROR: Could not open file: %s\n", file_in);
return 1;
}
*totalwords = 0;
while (fgets(line, linelength, streamVec) != NULL) { //New line read from the file
if ( ! isContained(line, currentList, *totalwords)){ //check if the word is already in the list
currentList[*totalwords] = malloc(strlen(line) * (sizeof(char)+1));
strcpy(currentList[*totalwords], line);
(*totalwords)++;
}
} //End of the read loop
fclose(streamVec);
for (i = 0; i < *totalwords; i++) {
printf("%i %s\n", i, currentList[i]);
free(currentList[i]);
}
free(currentList);
}
int文件处理(char*file\u in,int*totalwords){
文件*streamVec;
char*line=malloc(200);
int i=0;
int numberoflines=1000;
char**currentList=malloc(numberoflines*sizeof(char*);
int linelength=500;//确保完全读取行的任意值
streamVec=fopen(文件在“r”中);
如果(streamVec==NULL){
printf(“***错误:无法打开文件:%s\n”,文件\u在);
返回1;
}
*totalwords=0;
while(fgets(line,linelength,streamVec)!=NULL){//从文件中读取新行
如果(!isContained(line,currentList,*totalwords)){//检查单词是否已在列表中
currentList[*totalwords]=malloc(strlen(line)*(sizeof(char)+1);
strcpy(当前列表[*totalwords],行);
(*总字数)+;
}
}//读取循环结束
fclose(streamVec);
对于(i=0;i<*totalwords;i++){
printf(“%i%s\n”,i,currentList[i]);
自由(当前列表[i]);
}
免费(当前列表);
}
int包含在内(char*mystring,char**arrayofstring,int arraylength){
int i;
对于(i=0;i
您发布的代码经过编译,但在运行时失败。调试器对此位置注释并定位了第一个失败:
…内存分配似乎是罪魁祸首 下面是一些建议,以及指向一两个代码片段的链接,这些代码片段可能有助于下面的建议 问题陈述:
- 将文件中的单词列表(按每行一个单词排列)读入单词数组
- 从数组中计算不同/唯一单词的列表
- 从原始文件中获取字数
- 从原始文件中获取最长单词的长度
- 创建存储以包含原始文件中的单词列表。
(使用前两步中收集的信息。) - 将原始文件中的单词读入完整的单词数组
- 对单词的完整数组进行排序。(这是可选的。)
- 使用
函数循环排序的完整数组,以计算唯一/不同的单词列表isContained()
(同样是可选步骤。)您发布的代码经过编译,但在运行时失败。调试器对此位置注释并定位了第一个失败: …
内存分配似乎是罪魁祸首 下面是一些建议,以及指向一两个代码片段的链接,这些代码片段可能有助于下面的建议 问题陈述:
- 将文件中的单词列表(按每行一个单词排列)读入单词数组
- 从数组中计算不同/唯一单词的列表
- 从原始文件中获取字数
- 从原始文件中获取最长单词的长度
- 创建存储以包含原始文件中的单词列表。
(使用前两步中收集的信息。) - 将原始文件中的单词读入完整的单词数组
- 对单词的完整数组进行排序。(这是可选的。)
- 使用
函数循环排序的完整数组,以计算唯一/不同的单词列表isContained()
(也是可选步骤。) 这行不正确。 应该是:
currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));
以便为空终止添加额外字节
这行不正确。
应该是:
currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));
为了添加空终止的额外字节。为什么强制转换
malloc(((双)线宽))
?在初始化行时分配的内存会发生什么情况呢?
?至于您的问题,请记住,在C中字符串实际上被称为以null结尾的字节数组。您必须记住也要为null结尾符分配空间。currentList[*totalwords]=malloc(strlen(line)*sizeof(char);
-->currentList[*totalwords]=malloc(strlen(line)*sizeof(char)+1);
Make s
currentList[*totalwords] = malloc((strlen(line) + 1) * sizeof(char));