• ベストアンサー

scanfで正しい値を入力できない

キーボード入力をするためにscanfを使い、scanf("%c%s,&c,&s)を使用しましたが、この値をprintfで確認すると 入力しない値が表示されます。この回避方法を教えていただけませんか。

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

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

> scanf("%c%s",&c,&word); > printf("c=%c:r=%s\n",c,word); これを scanf("%c%s",&c,word); // &wordをwordに rewind(stdin); // 追加 printf("c=%c:r=%s\n",c,word); に変更してみてください。 scanf()を使用する際は改行の処理に気を使う必要があります。それについて、ここで述べるのは文字数が多くなってしまうので、ご自分で調べてみてください。scanf 改行で検索すればすぐに出てくると思います。

miya2003
質問者

お礼

できました。ありがとうございました。 scanf 改行で検索したら沢山出てきまして、初心者はscanfを使うなというメッセージになるほどと思いました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#include <stdio.h> int main(void){ char buff[80]; char word[20]; char c; int i; for (i=0;i<3;i++){ fgets(buff,80,stdin); sscanf(buff,"%c%s\n",&c,word); printf("c=%c:r=%s\n",c,word); } return(0); } のように、sscanfを使うことにしたらどうでしょう。

miya2003
質問者

お礼

できました。ありがとうございました。 いろいろな方法があるのですね。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

> printf("c=%cst:r=%s\n",c,str); > c=ast:r=bbbと出力されます。 これで問題ないのではないでしょうか? もしc=a:str=bbbと出力したいのなら、printfを以下のように書き換える必要があります。 printf("c=%c:str=%s\n",c,str); 「:」の位置を変えてください。

miya2003
質問者

補足

すみません.間違えました。実は下記のようなプログラムです。 int main(void){ char word[20]; char c; int i; for (i=0;i<3;i++){ scanf("%c%s",&c,&word); printf("c=%c:r=%s\n",c,word); } } 最初にa bbb と入力すると、c=a:r=bbbですが、 2回目にa bbb と入力すると下記のように異なる値が出力され、三回目の入力をしないまま終了します。 c= :r=a c= :r=bbb よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • keyguy
  • ベストアンサー率28% (135/469)
回答No.2

入力しない値が表示されます。: どういう結果だったか書いたらどうでしょうか? 質問するのならば回答しやすいように 回答社に負担をかけないようにすべきです プログラム内容(main行を書いても5行程度で済むはず)とその結果を書くほうがいいでしょう

miya2003
質問者

お礼

早速のご返事ありがとうございました。 ご指摘のとおりだと思いました。すみません。 プログラムは下記になります。 int main(void){ char str[20]; char c; scanf("%c%s",&c,str); printf("c=%cst:r=%s\n",c,str); } 現象は入力をa bbb とすると、出力がc=ast:r=bbb になります。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

> scanf("%c%s,&c,&s)を使用しましたが この部分だけ示されても分かりません。出来ればその前後も示していただきたいのですが、もしかしたら以下のように書き換えればうまくいくかもしれません。 scanf("%c%s",&c,s); sの前にある&をとったものです。

miya2003
質問者

お礼

早速のご返事ありがとうございました。 結果は同じでa bbbと入力すると c=ast:r=bbbと出力されます。 プログラムは下記になります。 int main(void){ char str[20]; char c; scanf("%c%s",&c,str); printf("c=%cst:r=%s\n",c,str); }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 関数の値(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)を返す。

  • scanf関数を用いての標準演算子(*/+-%)の入力方法

    C言語超初心者のものです。 scanf関数を用いての標準演算子(*/+-%)の入力方法について質問があります。 例:17 / 5 = 3 において ”17”、 ”/”、 ”5” を各々キーボードから入力し、”3”の数値をDOS画面?上に表示させるものです。 ”17”、”5”はscanf関数を使いキーボードから入力できるのですが、”/”だけがどうしても標準演算子として認識させることが出来ません。 私は以下のプログラムを組んでいるのですが、 char num3;  ・・・(省略) printf("Please type in a operator: "); scanf("%c",&num3);  ・・・(省略) printf("%d %c %d is %d\n", num1, num3, num2, product); 無理やりコンパイルして、DOS画面?上に表示させても17 / 5=65536となってしまいます。 ”/”をプログラミングの中で認識させて、ディスプレイ上で例式が正常に表示されるようにしたいのですが、どうしても回答が3になりません。 多分1つの標準演算子が入力できれば、他の標準演算子も入力できると考えています。 どうすればキーボードから標準演算子をプログラミングに認識させることが可能になるのでしょうか? どなたか分かる方がいらっしゃいましたら教えて下さい。 また参考になるURLなどがあればそれも教えて下さい。 よろしくお願いします。

  • scanfが2回使えない・・・?;

    scanfが使えなくて困っています。どなたか教えていただけないでしょうか(>_< 現在scanfが2つあるプログラムを作っています。 scanfのあるプログラムを実行すると入力待ち画面になりますよね。以下のプログラムを実行すると 1回目のscanfは入力待ちになるのですが2回目は入力待ちにならずに 最後まで行ってしまいます・・。 void main(){ int b; char d, names[20]; printf("名前入力\n"); scanf("%s", &names); printf("1文字キー入力\n"); scanf("%c", &d); printf("\n名前は %s : キーは %c です。\n", names, d); } 実行結果 -------------------------------------- 名前入力 dra2jp 1文字キー入力 名前は dra2jp : キーは です。 -------------------------------------- 名前入力のところは入力待ちになるのですがキー入力ができずに一気に最後までいってしまい、 つまり2回入力待ちにならなければならないのに1回の入力でプログラムが終了してしまいます。 どこが間違っているのでしょうか(>_< どなたかご指導お願いします:;

  • scanf()関数の使い方について

    はじめまして。 質問があります。 まずは、以下のコードを見てください。 ---------------------------------------------------------------- #include<stdio.h> int main(void) { char c; int i; printf("0を入力すると終了します。\n"); while(1) { printf("文字を入力してください=>"); scanf("%c",&c); printf("入力した文字は %c です。\n",c); printf("数字を入力してください=>"); scanf("%d",&i); if(i==0) { break; } printf("入力した数字は %d です。\n",i); } return 0; } ---------------------------------------------------------------- 上のコードを実行すると、初回はscanf()はcharとintの両方とも 入力待ちになってくれるのですが、2回目以降はcharは入力待ちに なってくれません。これは、なぜなのでしょうか? ご教授お願いします。 現在VC++6.0を使用しております。

  • scanf()で、エラー対応

    scanf()を使用して、入力で例えば「5462fa」数字ではなく文字を入力してしまった場合エラー(無限ループ)になりますが、 これをscanf()を使用したまま再入力を促すことが可能でしょうか?よろしくお願いします。 #include <stdio.h> int main(){   int a , kazu;   for(a=0;a<1;){     printf("値入力せよー>");       scanf ("%d", &kazu);         if( kazu >= 1 && kazu <=100 ){           a = a + 1 ;         }else{           printf("1から100で入力せよ\n");         }   }   printf ("kazu = %d", kazu);   return 0; }

  • scanf関数を用いての加減乗除%+-*/入力 

    忙しい中失礼します。 C言語超初心者のものです。加減乗除入力方法について質問があります。 現在、scanf関数を用いて直接の加減乗除%+-*/を入力することにより、9-2=7なり、9*2=18なり、9/2=4なりの回答を出してみたいと思っているのですが、例2の文に変更した後、コンパイルしようとするとエラー(parse error before '2' )が出ます。 どのようにすれば、このエラーはなくなりますか?また、エラーがなくなれば、直接の加減乗除は可能でしょうか? 現在習っているC言語レベル: int、 scanf、 if-else 位です。 プログラム 例1 int main() { int num1, num2; char chr; printf("Enter an operator (* / + - %%): "); scanf("%c",&chr); scanf("%c",&num2); num1 = 9 - 2; printf("%d - %d = %d\n", 9, 2, num1); system("pause"); return 0; }  9-2=7    例2: num1 = 9 'chr’ 2; printf("%d %c %d = %d\n", 9, 'chr', 2, num1); scanfを用いてのキーボードからの”数値”の入力についての回答は沢山見つかるのですが、加減乗除入力についての回答はありませんでした。http://oshiete1.goo.ne.jp/qa1917724.htmlから多分”直接”の加減乗除入力なんてないのだろうな・・・と思いつつもどのページも’ハッキリ’とは書いていないので、質問しました。 そもそもscanf関数では直接の加減乗除入力を受け付けていない?ものなのでしょうか?もしあるのでしたら、その方法も教えて下さい。 どなたか分かる方がいらっしゃいましたら、回答願います。自分の知識の中では曖昧なのでハッキリした回答が欲しいのです。

  • scanf文で入力した値の計算がうまくいきません

    2つの少数を含む数字を入力し計算して出力するプログラムを作っているのですがうまくいきません。下がそのプログラムです。 #include<stdio.h> int main(void) { int ver1,ver2; printf("1つ目の実数を入力して下さい\n"); scanf("%f",&ver1); printf("2つ目の実数を入力して下さい\n"); scanf("%f",&ver2); printf("%f+%f=%f\n",ver1,ver2,ver1+ver2); printf("%f-%f=%f\n",ver1,ver2,ver1-ver2); printf("%f×%f=%f\n",ver1,ver2,ver1*ver2); return 0; }

  • scanf関数について

    scanf関数で、下記のように書いたとき char ss[10]; scanf("%s", ss); printf("ss=%s\n", ss); ssは9文字までしかはいりませんが、入力時に10文字以上入力したら、prinitf関数でちゃんと入力した(10文字以上)の文字を表示してくれました。 これは、ssの容量を越えた分のメモリを確保してくれているのですか?

  • scanfの\nの意味

    タイトルの通りです。 #include<stdio.h> struct Person{ char name[100]; char gender; int age; }; int main(void) { struct Person person1; printf("名前は:"); scanf("%s",person1.name); printf("\n年齢は:"); scanf("%d",&person1.age); printf("\n性別は:"); scanf("\n%c",&person1.gender); printf("\n{name=%s,age=%d,gender=%c}",person1.name,person1.age,person1.gender); return 0; } 上記において aaa , 11 , M と入力すると {name=aaa,age=11,gender=M} と表示されますが、 scanf("\n%c",&person1.gender); を scanf("%c",&person1.gender); に変えると {name=aaa,age=11,gender= } となってしまいます。 この理由と、/nの意味を教えてください。

  • 簡単なscanf文が、わかりません。

    #include <stdio.h> int main(void) { int data; scanf("%d",&data); /*入力部分*/ printf("%d\n",data); return 0; } 参考書には、キーで入力、enterキー押すと、はじめて文字が画面に表示されるとなってましたが。 実際は、enter押さずに、キーボードでキー入力した時点で文字が表示されますが、 どこが間違っているんでしょうか? コンパイラは、 Borland C++ Compiler です。 お願いします。