c - 将直到EOF的行读入C中的指针
问题描述
我知道有数百个关于它的主题,但我需要再问一次。我确实有以下代码:
char *str;
while(fgets(&str,50,stdin) != NULL && &str != EOF) {
printf(&str);
}
printf("Test");
我想阅读我的代码中的几行并用它们做一些事情。在那个例子中,它只是打印。我想在有 EOF 时结束,然后在 while 循环之后做其他事情。不幸的是,在我使用 CMD-D(Mac/CLion 上的 EOF)的那一刻,整个程序都会终止,不管后面是什么,所以输出中不再有“测试”。
有谁知道发生了什么?另请注意,我需要它作为 char 指针,因为我想稍后使用它。
解决方案
在您的代码中,str
它只是一个不指向已分配内存的指针。然后你要求fgets()
存储str
它读取的内容(但是存储在哪里,因为没有分配内存str
?!)。这会导致Undefined Behavior,并且必须修复。
一个简单的解决方案是制作str
一个字符数组。
您在代码中的EOF
内容表明您没有阅读该函数的手册,其中指出:
返回值:
如果在尝试读取字符时遇到文件结尾,则设置 eof 指示符 (feof)。如果这发生在可以读取任何字符之前,则返回的指针是空指针(并且 str 的内容保持不变)。
这意味着我们不需要额外的检查。
把所有东西放在一起:
#include <stdio.h>
int main()
{
char str[50];
while (fgets(str, 50, stdin)) {
printf("%s\n", str);
}
return 0;
}
它逐行读取文件,然后打印每一行。
有用的链接:从 fgets() 输入中删除尾随换行符。
PS:您可以将 50(数组的大小)用作 的第二个参数,但是当指针实际上指向存储内存的另一个位置(例如另一个数组)fgets()
sizeof(str)
时,这将不起作用。str
推荐阅读
- c - 设置同步文件写入超时而不用 time() 浪费微秒
- node.js - reactjs构建系统中发生了什么?
- scylla - change TokenRange on Scylla
- c++ - 要在 C/C++ 中使用共享库,.h 和 .so 文件都需要吗?
- mongodb - MongoDB 聚合 - 通过包含文本对结果进行分组
- android - 将光标移动到 TextField 的末尾 - Nativescript
- jquery - 仅在数据表中导出列标题
- firebase - 为什么 iOS 平台可以在没有 google 服务的情况下使用 Firebase/Firestore?
- javascript - 我可以将分析脚本放在 javascript 文件中吗
- javascript - 如何通过在 svg 中开始一个新循环来停止以前的动画