scanfについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
march3

scanfについて

#1

投稿記事 by march3 » 16年前

以下のプログラムを実行すると思うように動いてくれません。
#include<stdio.h>
int main(void){
    char a,b;
    scanf("%c",&a);
    scanf("%d",&b);
    printf("a = %d, b = %d\n", a, b);
    return(0);
}
------実行結果--------
A
4
a = ^@, b = 4
----------------------

aの値に'A'が入ってくれないのですが、なぜでしょう。

環境はVineLinux gccです。
よろしくお願いします。

バグ

Re:scanfについて

#2

投稿記事 by バグ » 16年前

printf("a = %d, b = %d\n", a, b);

この箇所を…

printf("a = %c, b = %d\n", a, b);

としても駄目ですか?

march3

Re:scanfについて

#3

投稿記事 by march3 » 16年前

早速の回答ありがとうございます。
先ほどのソースコードはデバッグ用のものでした。すみません。
printf("a = %d, b = %d\n", a, b);
の場合は、同じ入力で
a = 0, b = 4
と表示されます。
printf("a = %c, b = %d\n", a, b);
の場合は同じ入力で
a = ^@, b = 4
と表示されます。

バグ

Re:scanfについて

#4

投稿記事 by バグ » 16年前

では、試しに

char a = 'A';
printf("%c", a);

としたら、どういう風に表示されますか?

toyo

Re:scanfについて

#5

投稿記事 by toyo » 16年前

scanf("%d",&b);
char型の変数bに%dでint型の値を代入しています
私のFedoraではセグメンテーション違反になりました
char a;
int b;
にしたらどうでしょう

bitter_orange

Re:scanfについて

#6

投稿記事 by bitter_orange » 16年前

VineLinux gccはどう動くかわかりませんが、printfはたしか
%c→char型(1文字)
%d→int型なので

int main(void){
char a,b;

    scanf("%c %c",&a,&b);

    printf("a = %c, b = %c \n", a, b);

    return 0;
}
ではどうでしょうか。

バグ

Re:scanfについて

#7

投稿記事 by バグ » 16年前

ああ、なるほど、変数bがオーバーフローを起こして、たまたま隣接したアドレスに確保されていたaの領域に影響を与えていた…という事ですか。

march3

Re:scanfについて

#8

投稿記事 by march3 » 16年前

自己解決しました。
こういうことですね。
#include<stdio.h>
int main(void){
    char a,b;
    scanf("%c",&a);
    printf("a = %c\n", a);
    scanf("%d",&b);
    printf("a = %d, b = %d\n", a, b);
    printf("a = %p, b = %p\n", &a, &b);
    return(0);
}
----実行結果----
A
a = A
4
a = 0, b = 4
a = 0xbfffed9f, b = 0xbfffed9e
----------------

おそらくバグさんのおっしゃることが起こっているようです。
int bで回避できます。
お騒がせしました。

toyo

Re:scanfについて

#9

投稿記事 by toyo » 16年前

%hhd が使えるコンパイラなら
char b;
scanf("%hhd", &b);
という方法もあります。

閉鎖

“C言語何でも質問掲示板” へ戻る