行数を表示するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
天和

行数を表示するプログラム

#1

投稿記事 by 天和 » 15年前

こんにちははじめまして天和と申します
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:行数を表示するプログラム

#2

投稿記事 by バグ » 15年前

テキストファイルはいつ読みこんでいますか?(^_^;)

天和

Re:行数を表示するプログラム

#3

投稿記事 by 天和 » 15年前

申し訳ありませんコマンドプロンクトつかって読み込みます

Mist

Re:行数を表示するプログラム

#4

投稿記事 by Mist » 15年前

入力ファイルが

あ(改行)
い(改行)
う(改行)
[EOF]

となっているからであってプログラムとしては間違っていないと思いますよ。
getcharはif(c==EOF)の上にくるべきと思いますが。
上記でいえば、4行目には文字がないだけで行としては存在しているとみなすこともできますので。

あ(改行)
い(改行)
う[EOF]

のように、「う」の後ろが改行されていないファイルで実行すれば思った結果が得られると思います。

「最終行に何もない場合、行番号を出力しない」という条件を加えるのであれば、改行後の次の文字が
EOFでないことをチェックする条件式が必要ですね。

バグ

Re:行数を表示するプログラム

#5

投稿記事 by バグ » 15年前

書き方は私好みに修正しました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:行数を表示するプログラム

#6

投稿記事 by 天和 » 15年前

うーんでもこれは1文字1文字チェックするやり方なので・・・・
もし改行したあとEOFかどうかと調べる方法があればいいんですが・・・

天和

Re:行数を表示するプログラム

#7

投稿記事 by 天和 » 15年前

↑失礼しましたバグさんの文章読み忘れてました
おかけで解決しそうです

バグ

Re:行数を表示するプログラム

#8

投稿記事 by バグ » 15年前

あとは1つ前の文字を保持しておくという方法もあります。個人的にはそちらの方が、よりスマートだと思いますが、今回は天和さんのコードをできるだけ残してみました(^-^)

バグ

Re:行数を表示するプログラム

#9

投稿記事 by バグ » 15年前

ちなみにこんな感じです。
#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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る