关于fgets()
优先使用scanf()
和gets()
,我在SO上发了很多帖子。有些人提到了fgets()man page。
然后有this wonderful post 显示fgets()
使用strlen()
存储的字符数。此帖子中的一个答案提到了fgets()保留的手册页中所述\n
(如果有的话),这就是strlen()
函数返回text_size + 1的原因。我试图通过一个程序测试它:
#include<stdio.h>
#include<string.h>
#define text_size 10
int main(void)
{
char str[text_size+1];
fgets(str,sizeof(str),stdin);
printf("%s",str);
printf("%d",strlen(str));
return 0;
}
当我输入大小小于text_size
的文本时,strlen(str)
返回值(text_size + 1),在阅读保留{{1}的手册页后,这对我来说是完全可以理解的在文本之后。例如: -
INPUT:你好
输出:你好6(我猜这里保留了\ n)。
但是当我输入精确大小的文本为\n
或更大的大小时,text_size
返回的值等于(text_size),因此打印出10,我想知道为什么{{1这里丢弃了吗?
INPUT:helloworldhi
输出:helloworld 10(为什么11还没有返回此处,因为还有1个字符位置仍在那里,我不明白这里的哪个字符已被优先strlen(str)
或\n
和为什么???
我不太确定C中的所有未定义行为,但我们可以将其称为UB吗?
答案 0 :(得分:2)
fgets(str,sizeof(str),stdin);
在这里指定缓冲区的大小,因此当文本太多时,它只会读入(大小 - 1)字符,以便为空字符腾出空间。
查看fgets
从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。