2016-04-03 4 views
1

私はすべての入力行を逆にするプログラムを作成しています。2回入力するのではなくEOFまで入力するfgets()

これは私のコードです:

#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キーを押し自分の行に入力する必要がありますが、なぜ私はそれを行う必要があるのか​​分かりません。

+1

リバース「?」を逆転するプログラムですか?あなたは単にprintステートメントが必要なように思えます。 –

+1

'for'ループ、' printf( "\ n"); 'の後に、最初の行の逆入力と同じ行に次の入力行を入力します。 –

+1

また、 '\ n'が文字列内にあることを確認する必要があります。 'fgets'が文字を読み込むと、エラーが発生しない限り' NULL'を返しません。つまり、 'Hello \ n 'の代わりに 'Hello 'を読むことができます。 ''はあなたのバッファには入っていないので、 "Hello"と 'c [strlen(c) - 1] = 0;'は "olleH"の代わりに "lleH" " –

答えて

2

あなたのコードは正確に言われているとおりです。だから、あなたは自分のforループの後、次の使用、ちょうど逆の文字列の後に改行文字をしたい場合:

putchar('\n'); 

をそして、あなたはc[strlen(c) - 1]は、改行文字であることはguarenteeがないことを心に留めておく必要があります。だから、'\0'でそれを交換する前に、それをチェック:

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

をまた、あなたがC89で立ち往生している場合、あなたにも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 0; /* Usually, 0 indicates success */ 

を追加します。

+0

警告を避けるために 'main'に' return'文もありません。 – jdarthenay

+0

@jdarthenayありがとう!追加されました。 –

関連する問題