• ベストアンサー

Cのgetcharについて

Cの文字取得についての質問です。 #include <stdio.h> main() { int a,b,c,d; b=0; printf("1~10の間で数字を入力してください。\n"); scanf("%d",&a); printf("%dで処理します。\nよろしいですか?\nはい:y いいえ:n\n",a); c=getchar(); この場合getcharで文字を取得することができません。 というかenterを押して次に進んだようになってしまいます。ですがc=getchar();を2回繰り返すと文字を取得できます。 1回だと文字取得できなくて2回繰り返すと文字を取得できる理由が知りたいです。 scanfを最初に行っている事が絡んでると思うのですが 具体的な理由を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

#5 です。 ユーザーからの対話的入力処理には、fgets で一行まるまる読んで、そこから sscanf で欲しいものを切り出すのが良くて、scanf や getchar を使うのはいまいちだ、といいたかったのですが。つまり、scanf を使っているところもgetchar を使っているところも fgets でやった方がいいということです。

その他の回答 (5)

回答No.5

scanf と getchar を使うのをやめて、fgets と sscanf を使ってはどうでしょうか。

0slowlykick0
質問者

お礼

回答ありがとうございました。 fgetsとsscanfの組み合わせでもやはりできませんでした。私のやり方に問題があるのかもしれません。 また考えてみます。もし方法が見つかったら返答 お願いいたします。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

> このscanfについて詳しくご教授いただけないでしょうか? 規格書かマニュアルを読んでください。 とりあえず、代表的なマニュアルを紹介しておきます。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_scanf.2c_.wscanf.asp

0slowlykick0
質問者

お礼

参考マニュアルありがとうございました。 早速教えていただいたとおりにやったのですが やはりscanfを行った後はgetcharはできませんでした。やり方が間違っているのでしょうか? お時間のあるときにでも返答お願いいたします。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

理由については既に解答が出ている通りですが、stdinのような入力ストリームに対してfflushを呼び出した場合の動作は未定義になります。 今回の場合は、 scanf("%d%*[^\n]%*c", &a); とすれば解決すると思います。

0slowlykick0
質問者

お礼

ご回答ありがとうございます。 まだ試しては無いのですが差し支えなければ このscanfについて詳しくご教授いただけないでしょうか?なんだか凄そうなものみたいなので。

  • hiropon80
  • ベストアンサー率30% (3/10)
回答No.2

回答は#1さんの通りで、「5エンター」と入力した場合、バッファ上に改行が 残るために本現象が発生してしまいます。 デバッグすると c に改行コードが入っているのがよくわかります。 fflushは機種依存がありますので、改行等を読み飛ばす自作関数を作成してはい かがでしょうか?

0slowlykick0
質問者

お礼

改行を読み飛ばす関数というのはどのようなものなのでしょうか?初心者なもので色々分からない点が多すぎて・・・・・よろしければご教授お願い致します。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

最初の入力で「5エンター」と入れますとこれは2文字です。 scanfで5が取り込まれて、getcharで「エンター」が取り込まれます。 scanfのあとにfflush(stdin)を入れて入力バッファーをクリヤーする方法がありますが 機種依存があるので本来は邪道だそうです。

0slowlykick0
質問者

お礼

ご回答ありがとうございます。入力バッファーをクリアすると良いが機種依存があるんですか。難しいですね・・・ymmasayanさんはこういう場合どのような方法をとっておりますか?

関連するQ&A

  • getcharの連続について

    6つの塩基(A、T、G、C)を入力して、それを一列に並べるというものなのですが、うまくいかないので、質問させていただきます。 #include<stdio.h> main() { char b1,b2,b3,b4,b5,b6; printf("6つの塩基を入力してください。\n"); printf("1つ目の塩基は?\n"); b1=getchar(); printf("2つ目の塩基は?\n"); b2=getchar(); printf("3つ目の塩基は?\n"); b3=getchar(); printf("4つ目の塩基は?\n"); b4=getchar(); printf("5つ目の塩基は?\n"); b5=getchar(); printf("6つ目の塩基は?\n"); b6=getchar(); printf("配列は%c%c%c%c%c%cです。\n",b1,b2,b3,b4,b5,b6); } こうすると実行したときに b1= b2=b3= b4=b5=となってうまく実行できないんですが、どうしたらよいのでしょうか? ちなみに「getcharと変数とprintfとscanfを使う」と問題の条件に書いてあるので、これだけで作れという問題ですが・・・

  • getchar()について 教えてください。

    visual studio 2010 professinalで以下のソースをデバッグして ”続行するには何かキーを押してください!”  で待機させたいのですが getchar()一個だけでは実現しません。   2個重ねるとOKです。どうしてでしょうか。  -------------- 以下のようにscanf関数がなければokということは突き止めたのですが、、、。  ご教授ください。 #include <stdio.h> int main(void) { int i; printf("なにか数字を入力してください。\n"); scanf("%d",&i); printf("今あなたが入力した数字は%dです。\n",i); printf("続行するには何かキーを押してください!"); getchar(); //getchar(); return 0; } ---------------------------------------------------------------- int main(void) { printf("続行するには何かキーを押してください!"); getchar();   return 0; }

  • C初心者です。どうかお助けを

    独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

  • getcharの働きについて

     1文字入出力関数getchar()、putchar()の働きを調べるため、次のソースを作って動かしてみました。'>'を使って、実行結果をテキストファイルに出力してみました。 ★ソース1(□はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □int ch; □printf("何か文字を入力して下さい。\n"); □printf("(Ctrl+Zが入力されたら終了します。)\n"); □while ((ch = getchar()) != EOF) □□putchar(ch); □ □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ★実行結果 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) a abcde ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  上のように、遊びで文字列を入力してみましたところ、1文字と同様に、入力したとおりに出力されました。そこで、入力したものを確認するために、printf()で出力する行を一つ次のように入れましたところ、次の実行結果のようになりました。 ★ソース2(□はタブ) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> int main(void) { □int ch; □printf("何か文字を入力して下さい。\n"); □printf("(Ctrl+Zが入力されたら終了します。)\n"); □while ((ch = getchar()) != EOF) □□printf("入力は%c\n", ch); □□putchar(ch); □ □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ★実行結果 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 何か文字を入力して下さい。 (Ctrl+Zが入力されたら終了します。) 入力はa 入力は 入力はa 入力はb 入力はc 入力はd 入力はe 入力は  ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  getchar()で上のように文字列を入力した場合、異常終了にはならないのでしょうか。また、2バイト文字('あ')とか、その文字列("あいうえお")を入力して実行してみましたが、異常にはなりませんでした。getchar()に文字列を入力した場合、どのように処理されるのでしょうか。実用的ではないかもしれませんが、コンピュータの動きをちゃんと理解したいと思いますので、よろしくお願い致します。

  • scanf関数のプログラムをgetchar関数で

    scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }

  • C言語 スロットみたいにするやり方が分かりません

    今自由課題でスロットのように数字を乱数で表示させて、Enterを押すと押したときの値を表示させたいです しかし、今書いているやつだとなぜかスロットみたいに数字の表示ができません。 おそらくif文で一旦止まってしまっていると思うのですが、どこが悪いのか教えてください。 #include <stdio.h> #include <stdlib.h> int main(){ int a,b,c; srand(time(NULL)); c = getchar(); b = rand()%6+1; for(;;){ a = rand()%6+1; printf("\033[H\033[J"); printf("%d",a); if(getchar() == '\n'){ printf("あなたのサイコロの値は%dです!!\n",a); break; }else{ continue; } } return 0; }

  • c言語なのですが

    c言語なのですが #include<stdio.h> main() { int a; printf("整数を5回足し算する\n"); scanf("%d %d",&a); printf("a*5=%d\n",a*5); return(0); } でエラーが起こります どこを修正すればいいのでしょうか

  • c言語についての質問です。

    #include<stdio.h> int main(void){ int a; printf("1文字たいぷしてください。\n"); scanf("%d",&a); if(a>=65 && a<=90){ printf("大文字です。\n"); } else if(a>=97 && a<=122){ printf("小文字です。\n"); } else{ printf("大文字でも小文字でもありません\n"); } return 0; } このプログラムは正しくなくて、 intをchar %dを%cにかえなければなりません。 なぜintはダメなんでしょうか? できれば丁寧に教えてください。 お願いします。

  • 2回目以降のgetchar()が反映されない

    以下のプログラムでは2回目からのgetchar()が反映されませんでした。 #include<stdio.h> main() { char res ; printf("ウェスト 85以上?\n"); printf("Y or N.\n"); res = getchar(); if (res == 'y'){ printf("体重80以上?"); res = getchar(); if (res == 'y'){ printf("メタボです\n"); } } return 0; } 課題のテーマであるif文の条件式はできたのですが、文字入力がうまくいきません。 実行結果が以下のように、2回目のgetchar()入力が飛ばされてしまいます。 ウェスト 85以上? Y or N. y 体重80以上? 他のトピックで、for文にすることで解決していたのですが、この課題の場合for文にしきれなかったので新しく質問させていただきました。 このプログラムの解決法と、もしご存知でしたらgetcharやscanfが連続で使えない理由も教えていただけないでしょうか。

  • Cのプログラミングを勉強中です。

    Cのプログラミングを勉強中です。 Aの値のBに対する割合を表示すしたいのですが、以下のように記述してもうまくいきません。 どこを直したらよいか教えていただけますか。 #include <stdio.h> int main(void) { int n1 , n2 ; printf("二つの整数を入力してください。\n"); printf("整数A:"); scanf("%d", &n1); printf("整数B:"); scanf("%d", &n2); printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 ); return(0); }

専門家に質問してみよう