
C言語において、文章を読み込むためにfgetsを用いて下記のプログラムを書いたのですが、*において入力を受け付けなくなります。
これを解消する方法はないでしょうか?
ちなみにコンパイラはBBC、開発環境はVistaです。
なお、簡略のため#include,main等は省略しています。
//以下プログラム
#define SIZE 16384
char moji[SIZE] = {""};
char buf[SIZE];
//EOF(^Z)になるまで、文字列を受け取る
while(fgets(buf, sizeof(buf), stdin) != NULL){
if(sizeof(moji) < strlen(moji) + strlen(buf))
break;
strcat(moji, buf);
};
getchar(); //*
//プログラムここまで
No.1ベストアンサー
- 回答日時:
★入力は受け付けています。
>*において入力を受け付けなくなります。
↑
思い違いです。
入力ファイルが 16384 バイト以上だと while 文を抜けます。
でもバッファには残りのテキストが存在します。
このテキストを getchar() は受け取ってしまうために
『入力を受け付けない』ように見えるだけです。
・解決策は while 文の後にバッファをフラッシュする処理を記述します。
下のサンプルをどうぞ。
サンプル:
while ( … ){
ここで入力と break の処理
}
// バッファのフラッシュ
while ( getchar() != EOF ){
;
}
// ここで一時停止
getchar();
↑
これなら入力を受け付けるようになります。
この回答への補足
補足欄ですいません。
どうも予想外のことが起きたので質問のソースに追加します。
下記でfgetsを使って入力した後についてですが、*2のgetcharを無視して、*1のscanfで入力を受け付けなくなります。
*2のgetscharについては、その個数を増やしても同様に無視されるようです。
void main(void){
int mode,r;
while(1){
do{
r = scanf("%d", &mode); //*1 1度目は「1」を入力
while(getchar() != '\n'){ };
}while(r == 0)
switch(mode){ //その他選択肢あり
case 1:
execute();
break;
}
}
return;
}
void execute(void){
while(fgets(~~) != NULL){
//先ほどの処理
}
while(getchar() != EOF){}
getchar(); //*2 これを無視して動作
return;
}
下記のように少し改変してみましたが、依然入力を受け付けないままです。
fgets以外の場合(getsなど)は、正常に入力することができるのですが、可能ならば使用は避けたいところです。
while(fgets(buf, sizeof(buf), stdin) != NULL){
if(sizeof(moji) < strlen(moji) + strlen(buf))
break;
strcat(moji, buf);
};
while ( getchar() != EOF ){;}
getchar();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
Eclipseコンソール表示を、リセ...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
Excel VBAで、Application.Inpu...
-
C言語 逆ピラミッドの作り方
-
"scanf"でエンターで改行させな...
-
Eclipseでコマンドラインを入力...
-
java初心者です。入力されたの...
-
getchar()について 教えてくだ...
-
プログラムC言語の整数の約数に...
-
C++:cinが上手く使えない
-
gets_sがうまく動かない
-
EDITコントロールで入力できる...
-
C言語でgetchar();が上手く使え...
-
MinGWのC言語でCTRL+Zで処理が...
-
入力エラーの処理について。
-
C言語 While文(ループ)内の...
-
至急!! C言語で多数入力をま...
-
Linuxプログラミングで、キーボ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
数字以外が入力されたらエラー...
-
*をユーザーが入力した数字の数...
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
プログラミング初心者です。 Py...
-
C言語でgetchar();が上手く使え...
-
Excel VBAで、Application.Inpu...
-
電卓の小数点
-
cout関数を使っているのですが...
-
"scanf"でエンターで改行させな...
-
小数か整数かを判定する方法
-
至急教えてください!プログラ...
-
getchar()について 教えてくだ...
-
scanf が無視されます
-
batプログラム上で文字列を入力...
-
コマンドプロンプトからのEOFの...
-
IF文で戻ることはできますか?...
-
プログラミングの問題です 「金...
おすすめ情報