C言語関係掲示板

過去ログ

No.1220 空白区切りでscanfの%cを使う場合の注意

[戻る] [ホームページ]
No.16114

scanfについて
投稿者---YANA(2004/08/08 21:17:05)


はじめまして
最近C言語を勉強している者ですがお尋ねしたいことがあります。

#include<stdio.h>
void main()
{
    struct gakusei{
        int no;
        char name[20];
        char sex;
    };
    struct gakusei a[5];
    int i;
    for(i=0;i<5;i++){
        scanf("%d%s%c",&a[i].no,a[i].name,&a[i].sex);
    }
    for(i=0;i<5;i++){
        printf("%d %s %c\n",a[i].no,a[i].name,a[i].sex);
    }
}



上のようなプログラムを書いたのですがコンパイルを行うと

1 aaa M
1 aaa
-858993460 フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ フ
-858993460 フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
フフフフフフフフフフフタ フ
-858993460 フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ フ
-858993460 フフフフフフフフフフフフフフフフフフフフフフフフタ フ
というようになってしまいます。

そこで試行錯誤して12行目を
scanf("%d %s %c",&a[i].no,a[i].name,&a[i].sex);
と直すと正常に動作するようになりました。
これはどうしてなんでしょうか?
たしか
scanf("%d%d",&a,&b);
のようなことはできたと思うのですが、%cではできないのでしょうか?

どなたかご教授いただける方がおられましたらよろしくお願いします。


No.16116

Re:scanfについて
投稿者---Sciggepy(2004/08/08 23:05:28)


scanf("%d%s%c",&a[i].no,a[i].name,&a[i].sex);

scanf("%d%s%c",&(a[i].no),a[i].name,&(a[i].sex));
としてみては?


No.16118

Re:scanfについて
投稿者---YANA(2004/08/08 23:58:26)


アドバイスありがとうございます。

scanf("%d%s%c",&(a[i].no),a[i].name,&(a[i].sex));
と直して実行してみたのですが、やはり変わりありませんでした。
私はVisualC++を使っているのですが、Sciggepy様の方では正常に動作されましたでしょうか?


No.16119

Re:scanfについて
投稿者---Sciggepy(2004/08/09 02:03:37)


すみません。問題の内容を勘違いしていました。

int d;
char str[20],c;
scanf("%d%s%c",&d,str,&c);

として、

1 aaa M

と入力した場合、

d=1
str=aaa
c=' '(スペース)

となってしまいます。「%c」はスペースを読み込んでしまうのです。
すると、ストリームバッファに残った'M'が「%d」の部分に入ってしまうため、読み取りエラーが発生し、それ以降のscanfは失敗します。
これを防ぐには、YANAさんの仰ったように、「%c」の前にスペース(' ')を入れます。


No.16121

Re:scanfについて
投稿者---YANA(2004/08/09 09:40:25)


>となってしまいます。「%c」はスペースを読み込んでしまうのです。
なるほど。scanf("%s"...)ではスペースで読み込みを終了するけれど、その後の%cにスペースが読み込まれてしまうのですね。

>これを防ぐには、YANAさんの仰ったように、「%c」の前にスペース(' ')を入れます。
これはどうしてなんでしょうか?C言語での仕様なのでしょうか?


No.16123

Re:scanfについて
投稿者---Sciggepy(2004/08/09 10:42:16)


>>これを防ぐには、YANAさんの仰ったように、「%c」の前にスペース(' ')を入れます。
>これはどうしてなんでしょうか?C言語での仕様なのでしょうか?
仕様です。
空白類の文字や読み取り指令以外の文字は、ストリームを進めるだけで、実際には読まれません。
できれば、各指令の間はスペースで区切っておいた方がよいでしょう。


No.16133

Re:scanfについて
投稿者---YANA(2004/08/09 21:39:29)


やはり仕様ですか。
>できれば、各指令の間はスペースで区切っておいた方がよいでしょう。
分かりました。これからはそうするように気をつけてみます。

いろいろと質問に答えていただいて本当にありがとうございました。