こんにちははじめまして天和と申します
C言語の質問掲示板と聞いて書き込みさせていただきます
1.問題
テキストファイルを標準入力からリダイレクト機能で読み込んで、行番号を付加して
標準出力して書き出すC言語プログラムを書きなさい
とのことですが
#include <stdio.h>
int main(void)
{
int c;
int e;
c = 0;
e = 1;
printf("%d:", e);
while(1){
if(c == EOF)
break;
c = getchar();
putchar(c);
if(c == '\n'){ e++; printf("%d:", e);}
}
return 0;
}
とプログラムを作ったのですが
それだと例えば
あ
い
う
とあったら
1:あ
2:い
3:う
4:
と1行分余分に出てしまいます
対処法のほうよろしくお願いします
行数を表示するプログラム
Re:行数を表示するプログラム
入力ファイルが
あ(改行)
い(改行)
う(改行)
[EOF]
となっているからであってプログラムとしては間違っていないと思いますよ。
getcharはif(c==EOF)の上にくるべきと思いますが。
上記でいえば、4行目には文字がないだけで行としては存在しているとみなすこともできますので。
あ(改行)
い(改行)
う[EOF]
のように、「う」の後ろが改行されていないファイルで実行すれば思った結果が得られると思います。
「最終行に何もない場合、行番号を出力しない」という条件を加えるのであれば、改行後の次の文字が
EOFでないことをチェックする条件式が必要ですね。
あ(改行)
い(改行)
う(改行)
[EOF]
となっているからであってプログラムとしては間違っていないと思いますよ。
getcharはif(c==EOF)の上にくるべきと思いますが。
上記でいえば、4行目には文字がないだけで行としては存在しているとみなすこともできますので。
あ(改行)
い(改行)
う[EOF]
のように、「う」の後ろが改行されていないファイルで実行すれば思った結果が得られると思います。
「最終行に何もない場合、行番号を出力しない」という条件を加えるのであれば、改行後の次の文字が
EOFでないことをチェックする条件式が必要ですね。
Re:行数を表示するプログラム
書き方は私好みに修正しましたm(__)m
#include <stdio.h> int main(void) { int c = 0, e = 0; /* 最初の行番号を表示 */ printf("%d:", ++e); /* 取得した文字がEOFでない間、ループし続ける */ while ((c = getchar()) != EOF) { /* 改行コードではない? */ if ((char)c != '\n') { /* そのまま表示 */ printf("%c", (char)c); } else { /* 改行コードを表示 */ printf("\n"); /* 次の文字がEOFではない? */ if ((c = getchar()) != EOF) { /* 新しい行番号と取得した文字を表示する */ printf("%d:%c", ++e, (char)c); } else { /* EOFがきたのでwhileループを抜ける */ break; } } } return 0; }
Re:行数を表示するプログラム
あとは1つ前の文字を保持しておくという方法もあります。個人的にはそちらの方が、よりスマートだと思いますが、今回は天和さんのコードをできるだけ残してみました(^-^)
Re:行数を表示するプログラム
ちなみにこんな感じです。
#include <stdio.h> int main(void) { int c = 0, d = 0, e = 0; while ((c = getchar()) != EOF) { if (d == '\n' || d == 0) { printf("%d:", ++e); } printf("%c", (char)c); d = c; } return 0; }