![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
int get_word(char *buf,int buf_size,FILE *fp)
{
int len;
int ch;
while((ch = getc(fp)) != EOF && !isalnum(ch));/*→「英数字のとき」このループは飛ばす。*/
if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。*/
return EOF;
}
len = 0;
do{
buf[len] = ch;
len++;
if(len >= buf_size){
fprintf(stderr,"word too long.\n");
exit(1);
}
}while((ch = getc(fp)) != EOF && isalnum(ch));
buf[len] = '\0';
return len;
}
int main(void)
{
char buf[256];
while(get_word(buf,256,stdin) != EOF){
printf("<<%s>>\n",buf);
}
return 0;
}
C言語ポインタ完全制覇という本のP67に載っていたプログラムをそのまま載せています。
get_word関数の中のif文で、EOFを返した時もループwhile(get_word(buf,256,stdin)により再入力するようなプログラムになっています。でも、「!=EOF」と記述されているのだから、EOFが返ったら終了だと思うのですが…
なぜ再入力し続けるプログラム(無限ループ)になってしまっているのでしょうか?
というか、私の環境で動作させたらおかしいだけじゃないでしょうか?
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
1> while((ch = getc(fp)) != EOF && !isalnum(ch)); /*→「英数字のとき」このループは飛ばす。
*/2>if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。*/
2>return EOF;
2>}
(略)
3>}while((ch = getc(fp)) != EOF && isalnum(ch));
3>buf[len] = '\0';
便宜上、番号を付けました
・「get_word関数の中のif文で、EOFを返した時」とは 2> のことですか?
それなら、これでEOFが返れば
>while(get_word(buf,256,stdin) != EOF){
が while(EOF != EOF)→while( 偽 )となりループが終了します。
3>でEOFになった場合も、次の呼び出しで getc()がEOFになるので、2>でEOFが返り、上と同様にループは終了します。
どこら辺で無限ループになる、とお考えですか?
ですよね。
理屈としてはkmeeさんがおっしゃっているように、ループは
終了する処理になってます。
とりあえず、客観的にこのプログラムは正しいと思うので
質問は締め切らせていただきます。
おさん方回答ありがとうございました^^
No.2
- 回答日時:
標準入力から、「EOF」を入力するには、
「CTRL+Z」だったかと思います。
処理系によってはやり方が違うかもしれません。
参考までにどうぞ。
せっかく回答していただいたのに申し訳ないのですが、標準入力
からEOFを入力させるプログラムではないです。
私の書き方がまずかったかもしれませんが…
関数get_wordによる戻り値がEOFならば、メイン関数の方の
ループを抜けるのではないかと思ったのですが、少なくとも
私の環境では抜けないのです。
No.1
- 回答日時:
>if(ch == EOF){/*もし英数字以外が入力されていたらメインプログラムにEOFを返す。
*/return EOF;
}
最初の文字を読み込んで EOF なら「 return EOF 」なので 下には行かず 戻るのでは?
そうですね。
戻るならば、
while(get_word(buf,256,stdin) != EOF){
printf("<<%s>>\n",buf);
}
の「get_word(buf,256,stdin) != EOF」部分の処理により
ループを脱出するのではないかと思ったのです。
ところが、私の環境ではstdinにより「*?」などの文字以外を入力
して引数にしても、またメイン関数でstdinによる再入力を
することになると言った動作になってしまっているのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した数値を倍々するプログラム
-
break文でループを一気に抜ける...
-
do-while文が禁止される理由
-
clock関数を利用した時間計測法...
-
ループを途中で抜けたいのですが。
-
C言語forループが完結した場合...
-
PIC のプログラムについて ど...
-
線形探索(番兵法)のプログラ...
-
While文の終わりにセミコロンが...
-
独立係数について教えて下さい。
-
Enterキーを押されたら次の処理...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
マイナスからプラスへ転じた時...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語について。
-
「Aに対するBの割合」と「Aに対...
-
正負を反転させて出力するプロ...
-
EXCELの分散分析表のP-値が....
-
大学数学の問題です。 加法群Z/...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
入力した文字列から母音だけを...
-
do-while文が禁止される理由
-
入力した数値を倍々するプログラム
-
C言語forループが完結した場合...
-
if文の中にfor文なのか、for文...
-
プログラミングC言語についての...
-
エクセルVBAで Do While (1)って?
-
For文の終了値を関数にしても問...
-
エクセルでC言語のfor文と同じ...
-
Delphiで・・・
-
ループの特定入力終了
-
UWSCにてある一定の動作を無限...
-
C言語、自己参照構造体のプログ...
-
C言語 数字を削除する関数
-
Cプログラムが終了しない
-
Excel VBAで年度をまたぐ期間の...
-
プログラムで関数は使わない方...
-
VBScriptでSQLに接続し、CSV出...
おすすめ情報