fgets如何对待Enter键?

时间:2018-08-29 00:26:12

标签: c fgets

我看到的是,在接受字符串的同时-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;
}

1 个答案:

答案 0 :(得分:1)

  

fgets如何对待Enter键?

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


“ fgets接受字符串直到按下回车键为止,”是因果关系。

让我们更深入

char *fgets(char *s, int n, FILE *stream);不会读取 string ,因为C定义了 string (最多为 null字符的字符)。 fgets()读取字符的 line 行(直到'\n'为止的字符)。它会读取它们到特定的位置-其余的留给以后使用。

  1. 读取'\n'(并保存)。
  2. 输入缓冲区几乎已满。 (除1之外的全部)
  3. 发生文件结尾。
  4. 发生罕见输入错误。

在情况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的描述中缺少类似的细节:缓冲区已满,文件结束和错误的特殊功能。