2

我在 SO 上浏览了很多关于fgets()overscanf()和. 的首选使用的帖子。有些人gets()提到了 fgets()手册页

然后有这篇精彩的帖子显示了fgets()使用strlen(). 我试图通过一个程序对其进行测试:\nstrlen()

#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的文本时,返回值 (text_size+1),在阅读了保留后文本strlen(str)的手册页后,这对我来说是很容易理解的。\n例如:-

输入:你好

输出:你好 6(我猜 \n 保留在这里)。

但是当我输入精确大小的文本text_size甚至更大的大小时,返回的值strlen(str)等于 (text_size) 并因此打印出 10,我想知道为什么\n这里丢弃了?

输入:helloworldhi

输出:helloworld 10(为什么这里没有返回 11,因为还有 1 个字符位置仍然存在,我不明白这里的哪些字符被优先考虑\0或者\n为什么?

我不太确定 C 中所有未定义的行为,但我们可以称它为 UB 吗?

4

1 回答 1

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

您在此处指定缓冲区的大小,因此当文本过多时,它将仅读取 (size - 1) 个字符,为空字符腾出空间。

看看fget

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

于 2013-06-26T09:35:59.373 回答