プロが教える店舗&オフィスのセキュリティ対策術

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(); //*
//プログラムここまで

A 回答 (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;
}

補足日時:2008/03/11 19:11
    • good
    • 0
この回答へのお礼

下記のように少し改変してみましたが、依然入力を受け付けないままです。
fgets以外の場合(getsなど)は、正常に入力することができるのですが、可能ならば使用は避けたいところです。

while(fgets(buf, sizeof(buf), stdin) != NULL){
if(sizeof(moji) < strlen(moji) + strlen(buf))
break;
strcat(moji, buf);
};

while ( getchar() != EOF ){;}

  getchar();

お礼日時:2008/03/11 19:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!