char* readScores(int* actualCount) {
char* stringArray = (char*)malloc(100*sizeof(char));
for(int i = 0; i <= 13; i++) {
*actualCount = *actualCount + 1;
scanf("%s", &stringArray[i]);
printf("stringArray = %s when i = %d\t actualCount = %d\n", &stringArray[i], i, *actualCount);
}
printf("Finished!");
return stringArray;
}
使用这段代码,我循环遍历一个 .txt 文件,里面有一些单词。当我运行这段代码时,我发现我确实在数组的正确位置得到了正确的单词,但是一旦循环到达文件末尾,程序就会给我一个段错误。我猜这是因为循环达到 EOF 值并引发错误,但我不知道如何修复它。这是结果的屏幕截图:http://i.imgur.com/kduzBnp.png
感谢您的帮助!
编辑
我将我的代码更改为:
while(scanf("%s", &stringArray) != EOF) {
*actualCount = *actualCount + 1;
printf("stringArray = %s when actualCount = %d\n", &stringArray, *actualCount);
}
但是,我仍然遇到具有相同输出值的段错误。所以我知道它正在正确读取文件,我只是不明白为什么它在最后停止并抛出错误。
最佳答案
只要 scanf
成功从标准输入中读取一个单词,您就想继续循环。
所以循环的终止条件应该使用scanf
返回的结果。
scanf
返回成功读取的项目数。如果成功读取一个单词,它将返回 1
,否则返回 0
或 EOF
。
但是您的代码还有其他一些问题。
char* stringArray = (char*)malloc(100*sizeof(char));
这不会为 100 个字符串分配空间,甚至不会为 100 个指向字符串的指针分配空间。它只是为一个包含 100 个 char
的数组分配空间。最好写成:
char *stringArray = malloc(100);
强制转换 malloc
的结果是不必要的并且可以掩盖错误,并且 sizeof(char)
根据定义为 1。
您的 for
循环将连续的单词读入内存,从分配数组中的位置 0 开始,然后是位置 1,然后是位置 2,依此类推,每次读取都会覆盖前一个的部分。
此外,具有"%s"
格式的scanf
本质上是不安全的,因为它会读取与用户键入的字符一样多的字符(或从任何stdin
连接到),无论目标数组的大小如何。
使用 fgets()
读取文本行,然后也许使用 sscanf
解析输入更安全(虽然 sscanf
有一些自身的问题)。
如果要存储多个字符串,则需要为它们分配空间。我不确定您要尝试做什么以提供更具体的建议。
关于c - 如何转换此 "for"循环以在 C 中使用 EOF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21744146/