• ベストアンサー

getchar関数について

初歩的なことなのかもしれませんが、お分かりになる方、教えてください。 getchar関数は、 int d; d = getchar(); のようにして使いますよね。 でも、 int c,d; do{  scanf("%d",&c) }while(c!= 0); d = getchar(); のように、getcharの前に繰り返し処理を置くとうまく実行できません。 なぜでしょう? ちなみにソフトはVisual C++6.0をつかってます。 よろしくお願いします。

  • h1sh
  • お礼率95% (39/41)

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

  • ベストアンサー
  • ysk6406
  • ベストアンサー率40% (237/589)
回答No.1

scanf 文の最後に“;”が無いのは書込みミスだとして… この場合、d に得られる文字は常に改行(0x0a)のはずです。 この scanf を実行するためには、何かの数字の後に Enter を打つ必要があります。 でも、この改行文字は scanf では読み取られずに入力チャネルに残っています。 そのため、次の d = getchar(); では、必ずこの残った改行が読み込まれてしまうのです。 対策の一つとしては、ループを抜けた後、fflush(stdin); をまず実行してやれば良いと思います。 (VC++6.0 SP5 でサンプルコードを書いて、確認しました。)

h1sh
質問者

お礼

早速の回答、ありがとうございます。 試してみたところ、正常に動きました! まさか scanf が悪さをしているとは思ってもみなかったので… Cの経験者の人たちが scanf は使えないと言われているのも こんなところに原因があるんでしょうね。 回答ありがとうございました。 助かりました。

関連するQ&A

  • 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の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を最初に行っている事が絡んでると思うのですが 具体的な理由を教えてください。

  • getchar関数について

     非常に初心者な質問なのですが、このようなCプログラムをみたことがあります。 #include <stdio.h> int main(void) { int c; while((c = getchar()) != EOF){ putchar(c); putchar(c); } return 0; } なのですが、このプログラムは、実行した状態で、「Hello」と入力して改行すると、「HHeelllloo」と表示されるのです。  そこで疑問なのですが、最初に宣言した変数は c だけなのに、どうして一気に「HHeelllloo」と表示できるのでしょうか?  個人的な予想をすると、最後に入力した「o」だけが表示されるような気がしてたまらないのですが・・・。    なぜなのか教えてください。

  • 関数の再帰処理

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657... という数列(フィボナ数列)を再帰処理でだしたいのですが・・・・・ include <stdio.h> int function( int ); int main( void ){ int n; do { printf( "0 以上の整数値を入力して下さい→ " ); scanf( "%d", &n ); }while ( n < 0 ); printf( "計算結果: %d\n", function( n ) ); getchar(); getchar(); return 0; } int function( int n ){ //フィボナの処理(function)の再帰呼び出しによる } function内に再帰処理を用いてprintf( "計算結果: %d\n", function( n ) );で画面出力したいのですが・・・・・・。

  • 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(); }

  • putchar(getchar())はなぜできない

    途中は省略しますが、 int main(void){ int c; c=getchar(); putchar(c); return 0; } はプログラムとして一文字入力・一文字出力しますが、 すこしプログラムを省略して   c=getchar(); putchar(c); を putchar(gerchar()); とすることは何故できないのか? プログラムの関数と数学の関数は違うという事や、int cでcがchar型でないこと。 これが数学の関数なら引数のない関数は数学にない事。 cは数学でいう代入ではなく、単なる箱で有ること。 getchar()の部分が'A'とかの定数なら領域として確保されているため、 int c; c='A' putchar(c)などせず、putchar('A') とできます。 又、この様な問題がHaskellのモナドに結びついていった。 など何となく分かりますが、いまいちきちんと説明できません。 宜しく願います。

  • 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()に文字列を入力した場合、どのように処理されるのでしょうか。実用的ではないかもしれませんが、コンピュータの動きをちゃんと理解したいと思いますので、よろしくお願い致します。

  • 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を使う」と問題の条件に書いてあるので、これだけで作れという問題ですが・・・

  • fflush(stdin)の使い方とprintf()関数getchar()関数の違いについて

    はじめまして。 現在c++を勉強し始めて1週間の初心者です。 fflush(stdin)について質問です。下記のプログラムで小文字入力したアルファベット1文字を大文字に変換して出力しています。方法(1)ではgetchar()関数とputchar()関数を使用していますがどうしてこの場合にはfflush(stdin)が必要となり、方法(2)のprintf()関数とscanf()関数を使用した場合はfflush(stdin)が必要ないのでしょうか?どなたか私のような初心者でも分かるように詳しく説明してもらいたいです。 何故かプログラムを書いているとprintf()とscanf()がよく混乱します。原因として、printf()を先に書く場合と、scanf()を先に書く場合が有るからだと思っているのですが、まだよく理屈の理解ができません。なので出来ればこれらの関数についても基本的な概念を教えていただきたいです。それと方法(2)では何故最後にscanf(%c):が無くても良いのかも良く理解できません。 どなたか是非とも回答宜しくお願いします。 #include <stdio> main void() { 方法(1) printf("\n文字を1つ入力してください:"); fflush(stdin);    char ch=getchar(); ch=ch-32; putchar(ch);    方法(2) printf("\n文字を1つ入力してください:") //fflush(stdin);必要なし???    char ch; scanf("%c",&ch); ch=ch-32; printf("%c",ch);    //scanf(%c):??? }

  • getchar,isalphaについて

    C言語を習いはじめてまもない者です。getcharとisalphaについて教えてください。  まず、getcharから。この関数は、キーボードから文字を一文字ずつ読み、読み出した文字を返す。といった働きをするそうですが、この関数を用いて、取り込んだ文字をなぜか、int型で宣言した変数に代入しています。(例:int aなどのaに取り込んだ文字を代入している。)なぜ、文字を取り込んでいるのに、intで宣言した変数に代入すのでしょうか?charで宣言した変数に代入しなくていいのですか?  次に、isalphaについてです。この関数は、変数に代入されている文字が数字か文字かを判断して、文字が入力されていると、0以外の値を返す関数だそうです。しかし、この関数も、変数の宣言がintです。なぜ、charではなくintで宣言するのでしょうか?

専門家に質問してみよう