• 締切済み

scanf の%10s について

初歩すぎる質問でもうしわけありませんが、 str[100]という配列を用意して 無限ループ内に while(1){ printf("入力してください>>>"); scanf("%10s",str); } などとして、実行して 10文字以上入力すると、 「入力してください>>>」が一回ではなく 「入力してください>>>入力してください>>>」 のように複数でるのですが、なぜでしょうか?? なにがおきているのでしょうか??

みんなの回答

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

10文字より多く(以上ではありませんね)入力した場合、初回のscanfではすべての文字を消化し切れません。 ですから、 printf("入力してください>>>"); scanf("%10s",str); /* ← ここで、0123456789abcd と入力 */ /* この時点で、str には 0123456789 が格納され、入力ストリームには abcd が残る */ printf("入力してください>>>"); /* (1) */ scanf("%10s",str); /* 先ほどの食べ残しである abcd が str に格納される */ printf("入力してください>>>"); /* (2) */ scanf("%10s",str); /* ← 入力ストリームが空になっているので、入力待ちに入る */ という訳で、上記の(1)および(2)の「入力してください>>>」が連続して出力されるのでしょう。 ただし、標準出力のバッファリングの仕様しだいでは、必ずしもこの動作になりませんのでご注意ください。

関連するQ&A

  • scanf関数について

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

  • scanfが実行されません

    Cについて質問です。 whileループに入る前にscanfでchar変数に文字を代入するようにして、その文字でwhileループの条件を設定したのですが、scanfが実行されずにすっ飛ばされてwhileループに入ってしまいます。 同じようなコードををdo-while文で書いてみたところ、一回目のscanfがやはりすっ飛ばされて二回目に入り、そこでscanfが実行されます。 エラーは出ません。何が間違っているのか、さっぱり分かりません。教えてください。

  • 関数の値(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()で、エラー対応

    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が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で入力形式を%dに指定した場合、文字をタ-ミナル上で入力しても読みとばされるようで、結果 printf("please input 0 or 1.\n") while(1){ scanf("%d",&a); if(a==0 || a==1)break; printf("please input 0 or 1!\n") } といったプログラムをかいた場合、while内を永遠さまようプログラムになってしまいました。 入力を%cにしてatoiを使う以外の手法で、入力を%dに固定するかもしくは文字が入力された場合にはエラ-をはくプログラムにしたいのですが、そのような変更は可能でしょうか? 初歩的な質問で申訳ありませんが、ご教授よろしくお願いします。

  • charと%c , %s の関係について

    char型の変数の扱いで悩んでいます。 具体的には以下の二つのプログラムの差異についてです。 ---------------------- char c; scanf("%c", &c); printf("%c\n", c); ----------------------- char c; scanf("%s", &c); printf("%s\n", &c); ----------------------- 上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。 どちらのプログラムも問題なく動作します。 僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。 scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。 逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。 何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。 僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。 ちなみに、 ----------------------- char c; char str[100]; scanf("%s", str); scanf("%c", &c); ------------------------ と書くと c には改行文字が代入されてしまいます。 scanf("%s", str); において"aasssdd "と最後に空白を入れると c には空白文字が代入されます。 しかし、 -------------------------- char str1[100]; char str2[100]; scanf("%s", str1); scanf("%s", str2); -------------------------- においては、 scanf("%s", str1); で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。 この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。 おそらく、 scanf("%s", str); の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。 分かる方がいましたら回答をよろしくお願いします。

  • fgets関数とscanfについて

    fgets関数とscanfの意味が似ていると思うんですが、違いは何ですか? 例えば、fgets( str, 81, stdin ) は変数strに80文字制限で、標準入力から入力するという意味ですよね? scanf("%s",s)は変数sに文字列を入力するという意味ですよね? 意味が似てると思うんですが、実際は何が違うんでしょうか? 回答よろしくお願いします。

  • 配列について

    プログラムで配列についてなのですが printf("配列sに20文字くらい入力してください。\n"); scanf("%s", s); printf("配列bに20文字くらい入力してください。\n"); scanf("%s", b); printf("入力したのは%sと%sですね?", s, b); というようなプログラムを実行し実際20文字くらい入れると文字がうまく表示してくれません。これは私のパソコンのメモリの問題でしょうか? ちなみに fprintf(fp, "%s\n%s", s, b); とすると、ファイルには正常に書き込まれています。

専門家に質問してみよう