【问题标题】:query regarding line feed and fgets()关于换行和 fgets() 的查询
【发布时间】:2014-03-02 08:24:06
【问题描述】:

代码1:-

int main()
{
    char str[200];
    fgets(str,200,stdin);
    printf("%s",str);
    return 0;
}

输出:-

ab cd
ab cd
(line feed)

代码2:-

int main()
{
    char str[200];
    gets(str);
    printf("%s",str);
    return 0;
}

输出:-

ab cd
ab cd

当我输入 ab(space)cd(enter key) 时,如果是 fgets(),我会在输出中得到 line feed,而如果是 gets(),则不会显示新的换行符。
在这种情况下,line feed 是怎么回事。

【问题讨论】:

  • The newline, if any, is retained. man fgets
  • @SakthiKumar : 如果在 fgets 的情况下保留换行符,那么代码 1 中应该有两个换行符,一个用于输入,另一个用于输出,但只有一个
  • printf("%s",str);。我猜输出中没有多余的\n

标签: c fgets gets linefeed


【解决方案1】:

gets() 和fgets() 将FILE 读取到提供的缓冲区中,直到检测到换行符。前者存储NUL 而不是 换行符,后者将NUL 放在 换行符之后。

请注意,gets() 是不安全,因为它不提供任何方法来保护超出所传递缓冲区限制的写入。

fgets() 获取缓冲区的大小,如果达到此大小,则停止读取。在后一种情况下,读取可能会在任何换行符被读取之前停止。

有关在缓冲区末尾切断各种换行符的一般方法,您可能想看看这个答案:https://stackoverflow.com/a/16000784/694576

【讨论】:

  • 听说gets用起来很糟糕,但是在这种情况下fgets很糟糕,那么gets和fgets有什么替代品
  • 我要求替代方案,因为在我的情况下,我不需要在 nul 之前换行
  • @kevingomes:请看我更新的答案。
  • 还有一件事我想知道为什么在fgets的情况下我在输出中只得到一个line-feed,应该有两个换行符,一个用于输入,另一个用于输出
  • 换行符是不可见的,您只需将光标放在新行上就可以注意到它。换行符之后的所有内容都写在新行上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多