2016-04-03 81 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謝謝!添加。 –