gpt4 book ai didi

c - fgets() 不保留 '\n' 作为数组大小的输入

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:16 26 4
gpt4 key购买 nike

我浏览了很多关于 SO 上关于优先使用 fgets() 而不是 scanf()gets() 的帖子。一些提到了 fgets() man page .

然后是this wonderful post 使用 strlen() 显示 fgets() 存储的字符数。这篇文章的一个答案提到了,如手册页中所述,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),这在阅读 man 后对我来说很容易理解它在文本后保留了 \n 的页面。例如:-

输入:你好

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

但是,当我输入与 text_size 或更大尺寸的文本时,strlen(str) 返回的值等于 (text_size),因此会打印 10 out,我想知道为什么\n在这里被丢弃了?

输入:helloworldhi

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

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

最佳答案

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

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

看看fgets

Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the end-of-file is reached, whichever happens first.

关于c - fgets() 不保留 '\n' 作为数组大小的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com