【问题标题】:C fgets() to get input until EOF rather than enter twiceC fgets() 获取输入直到 EOF 而不是输入两次
【发布时间】:2016-04-03 04:14:39
【问题描述】:

我正在创建一个反转每一行输入的程序。

这是我的代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char c[100];

    while((fgets(c,100,stdin)) != NULL)
    {
        c[strlen(c) - 1] = '\0';
        for(int i=strlen(c); i>=0; i--)
        {
            printf("%c",c[i]);
        }
    }
}

我的测试输入:

abc 123
lorem ipsum
dolor sit amet

我可以很好地打印第一行:

abc 123
321 cba

但是当我开始输入下一行输入时,它就在反向输入旁边,所以为测试输入运行的完整程序如下所示:

abc 123
321 cbalorem ipsum
muspi meroldolor sit amet
tema tis rolod

什么时候应该是这样的:

abc 123
321 cba
lorem ipsum
muspi merol
dolor sit amet
tema tis rolod

作为一种解决方法,我在输出后再次按 Enter 以便能够在自己的行上输入下一行输入,但我不明白为什么我需要这样做。

【问题讨论】:

  • "reverse the reverse" 的程序?听起来你只需要一个打印声明。
  • for 循环之后,printf("\n");,否则您将在第一行的反向输入的同一行输入下一行。
  • 您还应该确保\n even 在字符串中。如果fgets 读取任何字符,它不会返回NULL,除非发生错误。这意味着您可以阅读Hello&lt;EOF&gt; 而不是Hello\n&lt;EOF&gt;。由于&lt;EOF&gt; 不会在您的缓冲区中,因此您将读到“Hello”,而c[strlen(c) - 1] = 0; 将导致您打印“lleH”而不是“olleH”。
  • 请不要将文字作为图片发布。使用代码格式将其直接发布在问题中。

标签: c ansi-c


【解决方案1】:

您的代码完全按照它的指示行事。因此,如果您想在反转字符串之后添加换行符,请在 for 循环之后使用以下内容:

putchar('\n');

您需要记住,c[strlen(c) - 1] 是换行符并不能保证。所以,在用'\0'替换它之前检查它:

size_t len = strlen(c);
if(len && c[len - 1] == '\n')
    c[len - 1] = '\0';

另外,如果你被 C89 卡住了,你可能还需要从 main 返回一个值。只需添加

return 0; /* Usually, 0 indicates success */

main的末尾为了摆脱警告:

source_file.c: In function ‘main’:
source_file.c:8:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

请注意,return 0; 在 C99 及更高版本中是隐含的。

【讨论】:

  • main 中也缺少return 语句以避免警告。
  • @jdarthenay 谢谢!已添加。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2023-03-06
  • 2014-05-09
相关资源
最近更新 更多