我看到的是,在接受字符串的同时-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;
}
答案 0 :(得分:1)
fgets如何对待Enter键?
就像其他任何键一样,只是停止阅读更多内容的4个原因之一。
“ fgets接受字符串直到按下回车键为止,”是因果关系。
让我们更深入
char *fgets(char *s, int n, FILE *stream);
不会读取 string ,因为C定义了 string (最多为 null字符的字符)。 fgets()
读取字符的 line 行(直到'\n'
为止的字符)。它会读取它们到特定的位置-其余的留给以后使用。
'\n'
(并保存)。在情况1、2和3(如果至少读取了一些内容)的情况下,会将空字符附加到输入中。现在,输入肯定是 string ,并且函数返回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的描述中缺少类似的细节:缓冲区已满,文件结束和错误的特殊功能。