2017-02-24 5 views
0

私はK & Rから練習問題の1つを解決していましたが、マイナーな問題があります。 エクササイズは、単語の長さのヒストグラムを入力することです。EOFの前に改行がありませんか?

ここに私のコードです:

#include <stdio.h> 
#define IN 1 
#define OUT 0 

int main(){ 
    //Histogram of the length of words 
    int c, state, len, i; 
    state = OUT; 

    printf("Histogram\n"); 

    while ((c = getchar()) != EOF){ 
     if (c != ' ' && c != '\n' && c != '\t' && c != '\r'){ 
      state = IN; 
      len++; 
     } else if (state == IN){ 
      for (i = 0; i < len; i++){ 
       putchar('['); 
       putchar(']'); 
      } 
      len = 0; 
      putchar('\n'); 
      state = OUT; 
     } 
    } 

    return 0; 
} 

私が使用したテキストファイルだった:

Hello World! This is a text 

プログラムの出力だった:

Histogram 
[][][][][] 
[][][][][][] 
[][][][] 
[][] 
[] 

それが見られるように、プログラムは最後の単語 'text'のヒストグラムを出力する前に終了しました。 これは、Windows上のテキストエディタが自動的に '\ r \ n'を最後に付けないためですか?もしそうなら、どうしたらこの問題を解決できますか?

ありがとうございます。

+0

は 'fflushは(標準出力)を試してみてください;'あなたのプログラムの最後に。 –

+0

さて、ファイルをテキストエディタで開き、最後の行に改行を追加することができます。代わりに、lenが0でない場合にループを終了したときにもう一度印刷するという手順があります。 –

+0

ループを終了したくないときにループが終了します。終了条件をあなたが本当に望むものに変更してください。 (EOF *と* len == 0)。 –

答えて

1

ループエンドgetchar()が返されます。EOF最後にelse ifに入ることはありません。

例:

#include <stdio.h> 
#include <stdbool.h> 

int main(void) { 
    printf("Histogram\n"); 

    size_t len = 0; 
    bool running = true; 
    while (running) { 
    switch (getchar()) { 
    case EOF: 
     running = false; 
    case ' ': 
    case '\n': 
    case '\t': 
    case '\r': 
     if (len != 0) { 
     printf("\n"); 
     len = 0; 
     } 
     break; 
    default: 
     printf("[]"); 
     len++; 
    } 
    } 
} 
+0

すばらしい答えありがとう! – hemel

0

移動の周りのテスト:

while (true) 
{ 
    const int c = getchar(); 
    if (c != ' ' && c != '\n' && c != '\t' && c != '\r' && c != EOF) 
    { 
     state = IN; 
     len++; 
    } 
    else if (state == IN) 
    { 
     // ... 
    } 

    if (c == EOF) break; 
} 
+0

こんにちは、ありがとうございました! – hemel

関連する問題