c - 如何转换此 "for"循环以在 C 中使用 EOF?

标签 c string loops eof

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,否则返回 0EOF

但是您的代码还有其他一些问题。

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/

相关文章:

python - 将日期时间数据的数据框列转换为 DD/MM/YYYY 字符串数据

php - 在 mysqli 中使用 'config.php' 文件

c - 想要从 IPC 中的消息队列接收动态长度数据?

c - 强制 GCC 忽略某些标志?

mysql - 用于通过一个输出对多个字符串进行计数的 SQL 查询

Javascript:有没有办法在没有 eval() 的情况下使用字符串作为回调?

Java - 启动一个循环然后继续?

Javascript:for 循环不起作用

c - K&R C 函数指针

c - 尝试在 C 中打印 double 时没有得到正确的输出