• ベストアンサー

表示がうまくいかない…

iyomanteの回答

  • ベストアンサー
  • iyomante
  • ベストアンサー率60% (14/23)
回答No.5

事象を基に手動リバースエンジニアリングしてみました #include<stdio.h> int main() { char c,d; do { printf("文字を入力してください\n"); scanf("%c", &c); printf("あなたが入力した文字は%cです\n", c); }while(c != 'e'); return 0; } のような感じのソースと推測されます。 scanfで一文字入力を行うと、リターンキーがバッファに残って 繰り返し処理の場合次のscanfが直通してしまいます。 scanf("%c", &c); ↓ scanf(" %c", &c); // スペースを入れる とすると一応回避されます。

関連するQ&A

  • C言語のプログラムみてください(isdigit)

    質問は2つあります。 (1) scanf関数を使って、 時給: と表示されたところに一文字打ち込み、数字以外ならばもう一度 時給: と表示されるプログラムを作りたいです。 以下のプログラムなら、 isdigit関数は数字を渡せば0以外の数を返す(真)から、 while文の条件式(偽)のようにすれば、 ・数字を一文字うちこめばwhile文の条件式にあてはまらない、すなわち下のプログラムではisdigit(payment) != 0 となり、return 0; が実行され、プログラムが終わる ・数字以外を一文字打ち込めばwhile文の条件式が真となり、printf関数とscanf関数が実行されて入力待ち状態になる と思ったのですが、どうやら違うようです。実際には ・数字一文字打てばまた入力待ちになる ・数字以外を一文字打てば永遠にprintf関数とscanf関数が実行される のはなぜでしょうか。 #include <stdio.h> #include <ctype.h> int main(void){ int payment; do{ printf("時給[円]:"); scanf("%d",&payment); } while (isdigit(payment) ==0) ; return 0; } (2) 実際には、一文字の制限なく、数字以外の何かを入力したら、再び入力待ちになるプログラムを作りたいのですが、これはどうしたらいいのでしょうか。 つまり 時給: のところに数字以外ならまた 時給: となるようにしたいのです。お願いします。

  • do while文の条件

    do while文の条件にprintfを使う場合、これはありなんでしょうか? 内容:0が入力されていたら、whileのprintfを実行してからdoに戻る。0以外ならprintfを実行しないで処理を抜ける。 int i; do { printf("0以外の数字を入力してください。\n"); scanf("%d",&i); }while(i == 0 && printf("まじめに入力してください。\n"));

  • なぜ2回表示されるのでしょうか?

    このたび、諸事情によりC言語から再入門中です。 VisualC++2005を使っています。 do~while文を用いて、キーボードから'q'が入力されるまで、 画面に"qを入力して下さい"と表示し続けるプログラムを 作成してみました。 #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> // キーボードから'q'が入力されるまで、画面に"qを入力して下さい"と表示し続けるプログラム int main(void) { char c = '\0'; do { printf("qを入力して下さい\n"); scanf("%c", &c); if (c == 'q') { break; } }while(1); return 0; } 実行してみると、以下のように動作します。 1."qを入力して下さい\n"が表示される 2.'a'を入力してEnter 3."qを入力して下さい\n"が2行表示される おそらく、2の際に、'a'と'\0'を受け取ってしまい、 それが3の原因になっている気がします。 でも、scanfで"%c"を指定しているのに、こんなこと あり得るのでしょうか? 仮にソースに誤りが無かった場合、 たかが演習とはいえ自分としてはこの動作を回避したいのですが、 どういった対策があるのでしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いしますm(__)m

  • scanf関数について

    こんなプログラムがありました。 char str[80]; while(scanf("%s",str)>=1){    ・・・  } このwhileループは何が入力されたときに終了するのですか?scanf関数は入力された文字を返り値に持つとわかったので、改行コードを入力しましたが、終了しませんでした。どうすればよいのでしょう。よろしくお願いいたします。

  • while文の作成について

    キーボードに整数を打ち込み、0を打ち込むと終了し、その合計を出すプログラムを以下のように作りました。 #include<stadio.h> int main(void){ int num=0 int sum=0 printf("整数を入力"\n"); do{ scanf("%d",&num); sum +=num; }while(num); printf("合計は%dです。\n",sum); returen 0; } 次に負の値が入力されるまで整数を読み込み続け、その合計をを求めるプログラムを作りたいのですが、whileのところを }while(num>=0); としてみたのですが、うまくいきません。また分かり易くするため、入力した整数の個数も表示できるようにしたいです。どうすればよいでしょうか。詳しい方、教えてください。

  • 関数の値(scanf)

    初心者なもので、言葉の使い方を間違っていたら申し訳ありません。いいたいことが伝わればよいのですが…。 scanfに関して疑問に思ったことがあります。経験的なことなので、正しいかわからないです。次の(1)と(2)から(3)のことが正しいか教えてください。 (1) int a; do{ printf("整数を入力してください\n"); }while(scanf("%d",&a) ==0); printf("入力した数は、%dです",a) このとき、「(いかなる整数)+(ENTER)」を入力しても、do~whileのループを抜け出す。 (2)また、上のプログラムで、継続条件式の中身を  … }while(scanf("%d",&a)!=0);  … とすると、「(いかなる整数)+(ENTER)」を入力してもループが抜け出せない。 (3)したがって(1)と(2)から、scanf()は入力するだけで、値を真(1)を返す。

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • C言語の非標準コンソール関数getch()について

    こんにちは。 あるプログラムを作っていると、次のような問題が起きてしまいました。 簡単なプログラムを例にして、説明したいと思います。 #include<stdio.h> #include<conio.h> #include<ctype.h> void main(void) { char ch; int i; do{ ch=getch(); putchar(toupper(ch)); }while(ch!='q'); printf("\n"); scanf("%d",&i); } これはgetch()関数を使い入力された文字を大文字にして画面上に出力するものです。(qが入力されるまで) その後に、意味はありませんが変数iに整数を入力して終了する。 ここで、問題になってくるのがこのプログラムを実行して、abcdefqと入力していくと、画面上にはABCDEFQと表示されます。そして、qが入力されたことでdo文が終了して改行が行われます。次にscanfによりいったん入力待ちになります。 この時、まだ、なにも入力していないにも関わらず、最後にgetchにより入力したqが表示されてしまいます。 qを消してscanfの入力をすればいいのですが、この問題を何とか解決したと思い質問しました。 scanfの後にgetchar()を使うときはscanf入力時の'\n'に注意が必要だということはわかるのですが、上に述べたような問題はこれに似ているのでしょうか? 参考書をみたり自分でもいろいろ試してみたのですがどうもうまくいきません。 どなたか、解決策を知っていたら是非教えて下さい。 できれば、getch()とscanfがどのように作用してこのようなことが起きてしまっているのか説明して頂けたら幸いです。 お手数ですが、みなさま、よろしくお願いいたします。

  • 0x8, スペース, 0x8をプログラムで組むと

    『scanfを使わずに_getch()でキーボードからファイル名を入力していき、入力した文字をprintfで表示する流れについて質問です。 表示された文字をバックスペースで消していっても打ち込んだ文字は消えないですよね? 間違ったファイル名を入力してしまった際に文字が残っているので、正しく入力し直しても間違ったファイル名となってします。 一度打った文字を消す方法はありますでしょうか? 』 以前このような質問をさせていただき、_getch()で得た文字のキーボード上での削除の仕方は分かりました。 今度はそのやり方をプログラムで作るとしたら、どう組んでいけば良いのか教えて頂けないでしょうか。 できればそのプログラムを教えて頂けたら嬉しいです。 今現在書いてるプログラムのgetchを使っている部分です。 ファイルがオープンできたら別の処理に移行しますが、その関数は長くなるので省略しています。 #include <stdio.h> #include <conio.h> int main() { int key; int i; char file_name[256] = { 0 }; FILE *fp; errno_t e; while(1) { i = 0; // エンタキーが押されるまで入力を続ける do { printf("%c", key); file_name[i] = key; key = _getch(); i++; } while(key != 0x0d); printf("\n"); if(e = fopen_s(&fp, file_name, "rb") != 0) { printf("ファイルが存在しません\n"); return 0; } else { // 成功したらプログラムの処理をする関数に移行 return 1; } } }

  • C言語の無効な値が入力されたときの繰り返しについて

    C言語で最初に入力した整数の5倍になるまで何度も入力を促すプログラムでわからないところがあるのですが #include  "stdio.h" int main() { int a ; do { printf("input a:"); scanf("%d",&a); } while( )     ← printf( ) ←この二つの()内の文字をどうすればよいのか分かりません return 0; } 教えていただけないでしょうか