- ベストアンサー
標準関数 getchar( ) の動作について
getchar()の動作がよくわかりません。 以下のコードでバッファに'\n'が残ってしまっていて?その'\n'が読み込まれている事まで解りました。 どのようにすればキーボードから入力を受け付けるようになりますか? よろしくお願いいたします。 #include <stdio.h> int main(int argc, char *argv[]) { int iDataA = 0; int iDataB = 0; /* キーボードから文字を入力 */ iDataA = getchar(); /* <-- 'a'を入力しエンター */ iDataB = getchar(); /* <-- キーボードからの入力を受け付けません */ return 0; }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんなのはダメかな? ------------------------------------------------ #include <stdio.h> int main(int argc, char *argv[]) { char sDataA[2]; char sDataB[2]; /* キーボードから文字を入力 */ gets( sDataA ); gets( sDataB ); return 0; } ------------------------------------------------ gets() は入力データサイズの指定ができないので、バッファオーバフロー等の問題もあるのですが、こんな方法もあります、ということで。 安全策としては ・バッファを大きめにとる ・fgets() を使う などの方法がありますが、より安全なのは fgets() を使う方法かなぁ。。。 # fgets() を使う方法については、興味があったら考えてみてください。
その他の回答 (3)
- GWarsenal
- ベストアンサー率16% (1/6)
違う回答を書いてみます。 げっとちゃ~もありですが、こっちもありですよー #include <stdio.h> #include <conio.h> //必要^^; int main(int argc, char *argv[]) { int iDataA = 0; int iDataB = 0; /* キーボードから文字を入力 */ scanf("%d",&iDataA); scanf("%d",&iDataB); return 0; } //ここまで。 scanf関数も結構使えます(w printfと併せて覚えやすいので私はこっち使ってましたw
お礼
ご回答ありがとうございます。 GWarsenalさんの方法では数値は読み込めますが、文字は読み込めませんでした。 言葉足らずで申し訳ないです。。。
- alicia-y
- ベストアンサー率40% (85/208)
参考URLを見てもらえばわかるかな。 環境に依存した話になってしまいますので 参考程度に。
お礼
ご回答ありがとうございます。 getch()で期待する動作になりました。 また、知らない関数を覚えることもできました。 もう一つ質問いいでしょうか? VC++では実行ファイルを作成できましたが、普段使用しているcygwinのgccではリンクで失敗してしまいます。 gccでもgetch()はサポートしてるのでしょうか? 「man getch」で「curses.h」をインクルードすればできるような説明がでましたが・・・
- nitscape
- ベストアンサー率30% (275/909)
getchar()はストリーム型の読み込み関数だからではないでしょうか?頭の悪いソースですが以下のようにするといけると思います。 int n; n=0; while(n != '\n' && n != EOF) { n = getchar(); /* <-- 'a'を入力しエンター */ if(iDataA == 0) iDataA=n; } n=0; while(n != '\n' && n != EOF) { n = getchar(); /* <-- 'a'を入力しエンター */ if(iDataB == 0) iDataB=n; }
お礼
ご回答ありがとうございます。 こちらでも確認し、期待通りの動作となりました。
お礼
エレガントです。 gets()を使って作成する方向に決めました。 また、お昼休みにご回答頂きありがとうございます。(想像) fgets()のほうも勉強したいと思います。 単にstdinから改行とヌルターミネータを考慮した分を読み込めばいいのかな?