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ランキング
-
正負を反転させて出力するプロ...
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
java初心者です。入力されたの...
-
プログラミングの問題です 「金...
-
C言語でgetchar();が上手く使え...
-
C言語でつるかめ算をするにはど...
-
enterでループ終了
-
Eclipseコンソール表示を、リセ...
-
if文の条件にscanf関数を使うと…?
-
Javaについて質問です。 勉強し...
-
C言語について
-
scanf関数 バッファに残ったエ...
-
C++のcinの動作
-
Excel VBAで、Application.Inpu...
-
プログラミングの問題で、キー...
-
C言語
-
VB.NETで16進数+16進数や16進...
-
小数か整数かを判定する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
プログラミング初心者です。 Py...
-
double型が正常に認識されてい...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
scanfが2回使えない・・・?;
-
C言語scanf_sで何故か2回入力に...
-
if文の条件にscanf関数を使うと…?
-
Linuxで入力待ちなしkeyread関...
-
プログラミングの問題です 「金...
-
ワードで文字を入力する時の変...
-
cout関数を使っているのですが...
-
batプログラム上で文字列を入力...
-
Userformの入力順序をタブオー...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
gets_sがうまく動かない
-
Excel VBAで、Application.Inpu...
おすすめ情報