对于数组大小的输入,fgets()不保留'\ n'

时间:2013-06-26 09:32:31

标签: c string fgets strlen

关于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吗?

1 个答案:

答案 0 :(得分:2)

fgets(str,sizeof(str),stdin);

在这里指定缓冲区的大小,因此当文本太多时,它只会读入(大小 - 1)字符,以便为空字符腾出空间。

查看fgets

  

从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。