C fgets()获取输入直到EOF,而不是输入两次

C fgets()获取输入直到EOF,而不是输入两次,c,ansi-c,C,Ansi C,我正在创建一个程序,可以反转每一行输入 这是我的代码: #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--) {

我正在创建一个程序,可以反转每一行输入

这是我的代码:

#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
321 cba
但当我开始输入下一行输入时,它就在反向输入的旁边,因此测试输入的完整程序运行如下所示:

abc 123
321 cAlorem ipsum
穆斯皮·梅罗多洛·希特·阿梅特
蒂斯罗尔德酒店
当它看起来像这样时:

abc 123
321 cba
乱数假文
穆斯皮梅洛
多洛·希特·阿梅特
蒂斯罗尔德酒店

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

您的代码完全按照要求执行。因此,如果您想在反转的字符串后面加一个换行符,请在
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]
 }
 ^

注意
返回0在C99及以上版本中是隐式的。

一个程序来
“反转”
?听起来您只需要一个print语句。在
for
循环之后,
printf(“\n”),否则您将在与第一行反向输入相同的行上输入下一行输入。您还应确保
\n
偶数在字符串中。如果
fgets
读取任何字符,除非发生错误,否则它不会返回
NULL
。这意味着您可以阅读
Hello
,而不是
Hello\n
。由于
不会在缓冲区中,因此您将看到的是“Hello”,并且
c[strlen(c)-1]=0将导致您打印“lleH”而不是“olleH”。请不要将文本作为图像发布。用代码格式直接在问题中发布。在
main
中也缺少
return
语句以避免警告。@jdarthenay谢谢!补充。