gpt4 book ai didi

c - fgets 如何处理 Enter 键按下?

转载 作者:行者123 更新时间:2023-11-30 14:46:39 24 4
gpt4 key购买 nike

我看到的是,在接受字符串时 - fgets 接受字符串直到按下回车键,最后它不会用\0 替换回车键 - 而是将\0 附加到包括回车键的字符串中。相比之下,gets_s 获取字符串直到按下 Enter 键,最后用\0 替换最后一个 Enter 键。

这是正确的吗?请补充、更正、确认。也是这个意思。我的字符串处理操作逐个字符进行操作,直到遇到\0 - 现在 - 使用 fgets - 也会对换行符进行操作吗?

#include <stdio.h>
#include <conio.h>

int main()
{

char i[32];

printf("Enter a string of size 32 or less characters \n");
gets_s(i, sizeof(i));
//fgets(i, sizeof(i), stdin);

printf("With right justification, field width = 32 and precision = 10 -> i = ||%32.10s||\n", i);
printf("With left justification, field width = 32 and precision = 10 -> i = ||%-32.10s||\n", i);
printf("With right justification, field width = 10 and precision = 32 -> i = ||%10.32s||\n", i);
printf("With left justification, field width = 10 and precision = 32 -> i = ||%-10.32s||\n", i);


_getch();
return 0;
}

最佳答案

How does fgets treat enter key press?

就像任何其他键一样,除了它是停止阅读更多内容的 4 个原因之一。

<小时/>

“fgets 获取字符串直到按下回车键,”是一个因果解释。

让我们更深入

char *fgets(char *s, int n, FILE *stream); 不会读取字符串,因为 C 定义字符串 (直到并包括空字符的字符)。 fgets() 读取一行字符(直到并包括 '\n' 的字符)。它会读取它们直到某个点 - 将其余部分留到以后。

  1. 读取(并保存)'\n'
  2. 输入缓冲区即将满。 (除 1 之外的所有)
  3. 出现文件结尾。
  4. 出现罕见的输入错误。

在情况 1、2 和 3 中(如果至少读取了某些内容),将在输入中附加一个空字符。现在输入肯定是一个字符串并且函数返回s。在其他情况下,该函数返回(char *) NULL

请注意,如果 fgets() 读取空字符,它们将被像任何其他非'\n'一样对待。

<小时/>

Enter 导致 '\n':这也是一个字符。

'\n' 可能需要被丢弃以供以后处理。在这种情况下,只需将其砍掉即可。由于输入可能不包含 '\n',因此健壮的代码不依赖于它的存在。健壮的代码也不假设第一个字符不是空字符

size_t len = strlen(s);
if (len > 0 && s[len-1] == '\n') {
s[--len] = '\0';
}

// OR

s[strcspsn(s, "\n")] = '\0';
<小时/>

OP 对 gets_s() 的解释在 OP 的描述中缺少类似的细节:缓冲区已满、文件结束和错误的特殊功能。

关于c - fgets 如何处理 Enter 键按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52067856/

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