2016-04-03 79 views
1

我正在创建一个反转每一行输入的程序。C fgets()得到输入,直到EOF,而不是输入两次

这是我的代码:

#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 

作为一种变通方法,我按输入输出后,再次以能够进入下一行输入自己的路线,但我不明白为什么我需要这样做。

+1

一个程序来'倒退''?听起来就像你只需要一个打印声明。 –

+1

在'for'循环之后,'printf(“\ n”);',否则您将在与第一行的反向输入相同的行上输入下一行输入。 –

+1

你也应该确保'\ n'甚至在字符串中。如果'fgets'完全读取任何字符,除非发生错误,否则它不会返回NULL。这意味着你可以阅读'你好'而不是'你好\ n ''。因为''不会在你的缓冲区中,所以你读的是“Hello”,'c [strlen(c)-1] = 0;'会导致你打印出“lleH”而不是“olleH ”。 –

回答

2

你的代码完全按照它告诉的。所以,如果你只想要逆转字符串后换行字符,请使用以下只是你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以上。

+0

还缺少'main'中的'return'语句以避免警告。 – jdarthenay

+0

@jdarthenay谢谢!添加。 –