ページ 1 / 1
scanfについて
Posted: 2009年4月24日(金) 13:11
by march3
以下のプログラムを実行すると思うように動いてくれません。
#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について
Posted: 2009年4月24日(金) 13:16
by バグ
printf("a = %d, b = %d\n", a, b);
この箇所を…
printf("a = %c, b = %d\n", a, b);
としても駄目ですか?
Re:scanfについて
Posted: 2009年4月24日(金) 13:26
by march3
早速の回答ありがとうございます。
先ほどのソースコードはデバッグ用のものでした。すみません。
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について
Posted: 2009年4月24日(金) 13:32
by バグ
では、試しに
char a = 'A';
printf("%c", a);
としたら、どういう風に表示されますか?
Re:scanfについて
Posted: 2009年4月24日(金) 13:33
by toyo
scanf("%d",&b);
char型の変数bに%dでint型の値を代入しています
私のFedoraではセグメンテーション違反になりました
char a;
int b;
にしたらどうでしょう
Re:scanfについて
Posted: 2009年4月24日(金) 13:34
by bitter_orange
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について
Posted: 2009年4月24日(金) 13:36
by バグ
ああ、なるほど、変数bがオーバーフローを起こして、たまたま隣接したアドレスに確保されていたaの領域に影響を与えていた…という事ですか。
Re:scanfについて
Posted: 2009年4月24日(金) 13:47
by march3
自己解決しました。
こういうことですね。
#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で回避できます。
お騒がせしました。
Re:scanfについて
Posted: 2009年4月24日(金) 15:01
by toyo
%hhd が使えるコンパイラなら
char b;
scanf("%hhd", &b);
という方法もあります。