• ベストアンサー

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

はじめまして。 質問があります。 以下のコードを見てください。 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(void) { int i; char buf[256]; int y; int m; int d; printf("文字列を入力してください:"); scanf("%s",buf); i = sscanf(buf,"%d/%d/%d",&y,&m,&d); //OK #if 0 i = sscanf(buf,"%d %d %d",&y,&m,&d); //NG #endif printf("日付 %d-%d-%d 戻り値i=%d\n",y,m,d,i); return EXIT_SUCCESS; } ---------------------------------------------------------------- 標準入力から日付を表す文字列「例:"2007/04/17"」を入力してbufに 格納したものをsscanf関数の第1引数に指定して、y,m,dを表示 させてみると、「i = sscanf(buf,"%d/%d/%d",&y,&m,&d)」では、 うまくyとmとdに日付が格納される(つまり、yに2007が入り、mには 04が入り、dには17が入る。)のですが、 「i = sscanf(buf,"%d %d %d",&y,&m,&d);」でbufに格納すると、 yにはうまく格納されるのですが、他のmとdには、うまく格納してくれ ません。これは、なぜなのでしょうか? ご教授お願いします。

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

"%d %d %d"という書式文字列と実際の入力"2007/04/17"とが 合わなくなったときにsscanf()は停止します。 合わなくなったとき、とは、"/"を検知したときです。 "/"を検知する前に、yには2007という値を格納済みです。 sscanfが停止した時点で、mとdは不定のままです。

takeshix100
質問者

お礼

asuncion様へ ご回答ありがとうございました。 大変勉強になりました。 ありがとうございました。

takeshix100
質問者

補足

asuncion様へ ご回答ありがとうございました。 質問を投稿後すぐにご返事がきていたとは思わずご返事がおくれました。もうしわけありません。悪戦苦闘しておりました。 どうしてもわからず、もう一つだけ質問させてください。 以下のコードを見てください。 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> int main(void) { int i; char buf[256]; int y; int m; int d; char mon[20]; printf("文字列を入力してください:"); scanf("%s",buf); i = sscanf(buf,"%d %s %d",&d , mon , &y); printf("日付 %d-%s-%d 戻り値i=%d\n",d ,mon,y,i); return EXIT_SUCCESS; } ---------------------------------------------------------------- 標準入力から日付を表す文字列「例:"17 April 2007"」を入力して bufに格納したものをsscanf関数の第1引数に指定して、d,mon,yを表示 させてみると、最初のdが表示されるのですが、残りのmonとyが うまく表示されません。確かに"%d %s %d"という書式文字列と実際の入力"17 April 2007"を合わせてみたのですが、うまく表示されません。なぜなのでしょうか?ご教授お願いします。

その他の回答 (1)

  • tea_sheep
  • ベストアンサー率53% (8/15)
回答No.2

%s指定は空白文字で区切られるため「scanf("%s",buf);」という記述では入力された 「17 April 2007」のうち最初の空白までの「17」しかbufに格納されません。 そのため、後に続くsscanfでもその「17」しか取得されないのです。 この場合は scanf("%s",buf); の代わりに fgets(buf,sizeof(buf),stdin); などを使用します。

takeshix100
質問者

お礼

tea_sheep様へ ご回答ありがとうございました。 問題解決しました。 すっきりしました。 勉強になりました。 2つのご回答とも大変勉強になりまして 両者様ともに20点を与えたいのですが、 今回はご回答順で点数をつけさせていただきます。 大変申し訳ありません。

関連するQ&A