• ベストアンサー

scanf関数について

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

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

  • ベストアンサー
  • Fooky
  • ベストアンサー率71% (59/82)
回答No.2

要はEOF(End-Of-File)を示すキャラクタを入力するんですが、 UNIX系ならCtrl+D、DOSなら確かCtrl+Z。 VCとかはいじったこと無いんですが、何なんでしょう? ちなみに、例のプログラムの動作を見れば分かると思いますが、 改行記号は%sと%sの区切りとみなされます。他に区切りと認識される 記号は、スペースとタブです。

akirasuzu
質問者

お礼

やりました。動きましたよ。ありがとうございました。

その他の回答 (3)

  • coolguys
  • ベストアンサー率18% (351/1917)
回答No.4

コンソールアプリで Ctrl+ZそしてEnterとすると「EOF」が入り 終了すると思います。

akirasuzu
質問者

お礼

ctrl+ZでEOFが入るんですね。ありがとうございました。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

scanfで数値を読み込む場合などには、このような手が使われる場合があります。 scanfは実際に値を入れられたパラメータの数を返します。 例えば"%d"など数値待ちのときに文字列を入力すると、変数側では受け取れないと判断して、値は読み込まれません。 このとき入力した値はバッファ内に残ってしまうので、gets等をつかって読み捨てる必要があります。 例:数値が入力されるまで、入力を無視する。   int a;   char s[100];   printf("整数を入力してください。");   while (! scanf("%d", &a))     gets(s);   printf("入力値は%dです。\n", a);

akirasuzu
質問者

お礼

懇切丁寧に説明していただいてありがとうございました。

  • selenity
  • ベストアンサー率41% (324/772)
回答No.1

もう一度C言語のリファレンスを読み直してください。 int scanf(char *format [, ...]); なはずです。 scanfは入力(代入)されたパラメータの数を返します。 したがって[改行コード](またはNullキャラクタ)と いう文字列がstr[]に格納されるため、scanf()の 戻り値は1となり、whileのループからは抜けません。 ループから抜けるには[EOF]を入力する必要があります。 ただし、このwhile()の使い方はしくじると無限ループにに陥る可能性があるので正しく使う必要があります。

akirasuzu
質問者

お礼

まだまだ調べ不足でした。ありがとうございました。

関連するQ&A

  • scanfが実行されません

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

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

  • scanf の%10s について

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

  • fgets関数とscanfについて

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

  • scanf関数のループについて

    ソースコード---------------------------- #include<stdio.h> int main(){ char c; while(scanf("%c", &c) != 1){;} return(0); } -------------------------------------- 入力された文字数が1文字でない間入力待ちになるようなプログラムを意図しているのですが、 例えばaと打ってもaaと打ってもプログラムが終了してしまいます。 意図したようにプログラムが動作するにはどのように書き換えればよいのでしょうか。

  • 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); の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。 分かる方がいましたら回答をよろしくお願いします。

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

  • toupper関数とstrcmp関数を使った問題

    前回答えてくださった方々へのお礼 ・前回質問した際、質問に答えてくださった方々、皆様のおかげで問題を解く事ができました。本当にありがとうございました。 ↓ここから質問です。 「end」と入力されるまで、キーボードから文字列を読み取るプログラムを作成してください。ただし、大文字と小文字が混ざった「EnD」などでも終了するようにしてください。小文字を大文字に変換する「toupper( )関数」を利用してください。また、文字列の比較には「strcmp( )関数」を利用してください。 という問題を解いているのですが、自分でした結果 #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { char str[10]; ←str[10]は適当に値を決めているだけです int i,ret; int result; do { printf("文字列を入力してください:"); scanf("%s", str); i = 0; while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } result = strcmp("END", str); //文字列の比較 if (result == 0) { break; //ループを抜ける! } } while (1);            // 条件が1の場合は永久ループ return 0; } ここまではできたのですが、どうしても while (str[i] != ???? ) // 文字列の最後かチェック { ret = toupper(?); // toupper関数に1つずつ渡す i++; } この部分の「?」と書いている部分がわかりませんでした。 わかる方が居られましたらどうか教えてもらえないでしょうか? あと、おかしな部分等がありましたら教えてください。 どうかよろしくお願いします。

  • fscanf関数のscanf集合を使う時の不具合

    こんにちは。 現在、C言語でプログラミングをしています。 最近気が付いたのですが、fgetc、fputc、fgets、fputs、fprintfといった関数は、 呼び出されるたびにファイルの現在位置を進めるのですが、 fscanf関数において、scanf集合を使った場合だけは、 何故かいつもファイルの先頭からスキャンを開始するようです。 例えば、適当なテキストファイルtest.txtを作成し、 ------------------------------------ FILE *fp; char str[80]; fp=fopen("test.txt", "r"); while(!feof(fp)){ fscanf(fp, "%[a-zA-Z]", str) puts(str); } ------------------------------------ といったコードブロックを試してみると、永遠にforループが終了せず、 最初の英単語が何回も画面に出力されます。 このコードブロックの目的は、test.txtから、英単語だけを取り出して、順番に出力していく事です。 上のコードブロックで、whileループの最後に、fseek(fp, srtlen(str), SEEK_CUR); といったコードを挿入し、ファイルの現在位置を手動で進めてみたのですが、 どうも上手く行きませんでした。 scanf集合は便利なので、fscanf関数で使っていきたいのですが、こういった不具合があるので困っています。 上のコードブロックを上手く動作させる方法だけでもいいので、何かアドバイスを頂きたいと思います。 では、よろしくお願い致します。

専門家に質問してみよう