- ベストアンサー
scanf文がうまくいかないのですが・・・
下のようなプログラムを実行するとうまくいかないのですが、何故なのでしょう。 どうかお教えください。 #include<stdio.h> int main(void) { int i; char n; for(i = 0; i < 10; i++) { printf("nを入力してください>>>"); scanf("%c",&n); printf("%c\n",n); } return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
キーボードからnを入れた後に Enterキーを押しますが、 それも入力されます。 一方、scanf("%c" では一文字のみ読み込まれます。 一回だけならいいのですが、2回目のscanfではEnterに該当するものが読み込まれます。('\n') これが問題なら例えば、gets()を使って改行(Enter)までを一度に読み込み、行全体を文字列として比較すれば解決します。 fflushはおそらく出力だけにしか影響がないと思いますので、効果が無いと思います。 getcharを使っても同じ結果になると思います。
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>printf("大文字に変換しますか?(yes = y)>>>"); >scanf("%c",&l); のscanfを l=getchar(); としてみたらどうでしょう
gets()やscanf()を実行した後、 fflush( stdin ); でキーボードバッファ(標準入力 stdin )をクリアしてみてはどうでしょうか?!
- cats1234
- ベストアンサー率28% (103/356)
どのように動作させたいのですか? またscanfを使用しないと行けないのですか? もう少し詳しい状況を補足お願いします。
補足
要点をついた質問をしようと思ったのですが、 質問の内容が少し具体性に欠けたようですね。 作りたいプログラムは以下のとおりです。 下のプログラムはファイルに格納された英文ファイル に、 標準入力で入力した単語があれば、 その単語を大文字に変換した行を 出力するかを問うようにしたいのですがうまくいきません。 どうすればいいのでしょうか。ご意見お願いします。 #include<stdio.h> #include<stdlib.h> int str_length(char str[]); #define STRING_SIZE 100 int main(void) { int i,j,k,m,count, count2; char l; char str[ 20 ], long_str[ STRING_SIZE ]; FILE *fp; printf("単語を入力してください>>>"); gets( str ); if( (fp = fopen( "indata.txt", "r" ) ) == NULL ) { printf("ファイルが見つかりません。--- indata.txt\n"); exit( EXIT_FAILURE ); } while( fgets( long_str, STRING_SIZE, fp) ) { count = 0; count2 = 0; for(i = 0; long_str[ i ] != '\0'; i++) { k = i; for(j = 0; str[ j ] != '\0'; j++,k++) { if(str[ j ] != long_str[ k ]) { break; } } if(j == str_length(str) ) { count++; if(count == 1) { printf("%s", long_str); printf("大文字に変換しますか?(yes = y)>>>"); scanf("%c",&l); } if(l == 'y') { count2 = 1; m = i; for(; m < i + j; m++) { if( (long_str[ m ] >= 97) && (long_str[ m ] <= 122) ) { long_str[ m ] = long_str[ m ] - 32; } } } else break; } } if(count2 == 1) { printf("%s\n", long_str); } } fclose(fp); return 0; } int str_length(char str[]) { int i; for(i = 0; str[ i ] != '\0'; i++) ; return i; }
お礼
なるほど!!そういうことだったのですね!! gets()を使うことによってうまくいきました。 ありがとうございました。