我意识到C语言中有一些函数具有可选参数,这意味着用户可以将NULL作为参数值传递。我很好奇是否可以使用fgets()。
假设我想将整行作为字符串保存在文件中,换句话说,我希望fgets()在到达换行符时停止(\ n),那么我可以执行以下操作吗?
fgets(string, NULL, file); //where string is simply an array of char
我认为这是可能的,因为fgets()总是在到达换行符时停止,但如果不可能,当一个人不知道行长时,将整行保存为字符串的正确程序是什么? ?
答案 0 :(得分:3)
将NULL
作为尺寸参数传递给fgets
基本上会传入0
。 NULL通常定义为
#define NULL 0
但它应该用作指针,而不是int。
我怀疑传递大小为0
时fgets()的行为是未定义的,或者是无操作。
文档(在linux上)陈述
fgets() reads in at most one less than size characters from stream and stores them
into the buffer pointed to by s. Reading stops after an EOF or a newline. If a
newline is read, it is stored into the buffer. A terminating null byte ('\0') is stored
after the last character in the buffer.
如何读取-1
个字符?它会在哪里存储尾随NUL
?
这就是我倾向于未定义的行为的原因。
当你不知道它们可能有多长时间阅读字符串时,有两个部分要处理:
fgets
返回一个完整的缓冲区(其中s[size-2] != '\n'
),方法是通过realloc
生成一个动态分配的缓冲区,并用来连接fgets
的连续返回值直到看到新的一行。答案 1 :(得分:3)
C实际上没有可选参数 虽然有些函数为某些参数定义了特殊值(最常见的是指针参数的空指针),这意味着"做默认值"。
您 可以<{3}}使用fgets
作为特定文件,传递INT_MAX
,从而有效地删除限制。
在考虑这样做之前,请考虑为什么 C禁止gets
来自标准库。
另外,NULL
是一个实现定义的空指针常量,这可能意味着它不能隐式转换为int
。
答案 2 :(得分:3)
请改用getline
功能。这是手册页中的示例代码
char *line = NULL;
size_t linecap = 0;
ssize_t linelen;
while ((linelen = getline(&line, &linecap, fp)) > 0)
fwrite(line, linelen, 1, stdout);
请注意,如果缓冲区不够大,getline
会自动realloc
缓冲区,当您不再需要时,free
缓冲区是您的责任。