ページ 1 / 1
超初心者、変換指定子についての疑門
Posted: 2015年8月31日(月) 17:47
by el
例えば
#include <stdio.h>
int main(void)
{
int data=67;
printf("%c\n", data)
return 0;
}
こういったソースコードの場合、int型の宣言はしていますが
変換指定子はchar型のデータ型を指定していますのでコンソール
には『C』として出力さますよね?
しかし
#include <stdio.h>
int main(void)
{
int data;
scanf("%c", &data);
printf("%d", data);
return 0;
}
というソースコードは誤りになります。
この場合コンソールへ『67』と打ち込めば、
一度%cのデータ型であるchar型としてコンピューターが認識、
その後%dのデータ型であるint型として表示するという過程を通って
『67』とコンソールへ表示されそうだとなんとなく思うのですが
なぜそうならないんでしょう。
コンピュータとのやり取りの流れが認識できていないので
起こる疑問かと思いますが、教えていただけませんか?
Re: 超初心者、変換指定子についての疑門
Posted: 2015年8月31日(月) 18:48
by Dixq (管理人)
まず、フォーラムルールにあるように、ソースコードはcodeタグで囲んでくださいね。
投稿する時に一番上に警告が出ていると思います。
質問についてですが、
コード:
#include <stdio.h>
int main(void)
{
int data=0;
scanf("%c", &data);
printf("%d", data);
return 0;
}
で「6」と入力してみて下さい。
「54」と表示されます。
これは6という文字コードがdataに入ったのです。
アスキーコード表はこちらをご覧ください。
http://e-words.jp/p/r-ascii.html
printf("%d", '6');
と同じです。
ですから、
コード:
#include <stdio.h>
int main(void)
{
int a=0, b=0;
scanf("%c%c", &a, &b);
printf("%d\n%d", a, b);
return 0;
}
このようなコードをかいて「67」と入力すると
54
55
と表示されるはずです。
Re: 超初心者、変換指定子についての疑門
Posted: 2015年8月31日(月) 20:48
by みけCAT
まず、elさん、Dixq (管理人)さんともに間違っているのですが、
%cの読み込み先としてint型の変数(へのポインタ)を与えるべきではありません。
char型の変数(or領域)へのポインタを与えるべきです。
Dixq (管理人) さんが書きました:コード:
#include <stdio.h>
int main(void)
{
int data=0;
scanf("%c", &data);
printf("%d", data);
return 0;
}
で「6」と入力してみて下さい。
「54」と表示されます。
これは6という文字コードがdataに入ったのです。
たまたまリトルエンディアンの環境で実行し、かつ読み込む前に0で初期化したのでこういう結果になったのでしょう。
Dixq (管理人) さんが書きました:ですから、
コード:
#include <stdio.h>
int main(void)
{
int a=0, b=0;
scanf("%c%c", &a, &b);
printf("%d\n%d", a, b);
return 0;
}
このようなコードをかいて「67」と入力すると
54
55
と表示されるはずです。
このコードも同様に良くないです。
el さんが書きました:例えば
#include <stdio.h>
int main(void)
{
int data=67;
printf("%c\n", data)
return 0;
}
こういったソースコードの場合、int型の宣言はしていますが
変換指定子はchar型のデータ型を指定していますのでコンソール
には『C』として出力さますよね?
printf関数の%cはint型のデータを取り、それを文字コードとして出力します。
char型は関係ありません。
In printf(), the rvalue type promotions are expected. Thus %c actually corresponds to a parameter of type int and %f and %g actually correspond to parameters of type double.
printf and scanf format codes
el さんが書きました:しかし
#include <stdio.h>
int main(void)
{
int data;
scanf("%c", &data);
printf("%d", data);
return 0;
}
というソースコードは誤りになります。
そうですね。
前述の通り、scanfに渡す型が間違っています。
dataの型をcharにすれば、正しいコードになると思います。
el さんが書きました:この場合コンソールへ『67』と打ち込めば、
一度%cのデータ型であるchar型としてコンピューターが認識、
その後%dのデータ型であるint型として表示するという過程を通って
『67』とコンソールへ表示されそうだとなんとなく思うのですが
なぜそうならないんでしょう。
- %cは1文字(1バイト)だけ読み込むので、67の7は読み込まれず、当然出力にも反映されません。
- C言語では未初期化の自動変数は不定の値なので、6の文字コードも出力されない可能性があります。
el さんが書きました:一度%cのデータ型であるchar型としてコンピューターが認識、
その後%dのデータ型であるint型として表示するという過程を通って
ここは正しいと思います。
Re: 超初心者、変換指定子についての疑門
Posted: 2015年8月31日(月) 22:04
by Dixq (管理人)
間違っていることは承知です。たまたまではないし、0初期化したのも意図的です。
提示されたソースコードを実行したらどうなるかという疑問への回答です。
質問者が%cにintを渡すべきではないが疑問解消のため意図的に書いているという前提で回答しています。
Re: 超初心者、変換指定子についての疑門
Posted: 2015年8月31日(月) 22:15
by box
みけCAT さんが書きました:
6の文字コードも出力されない可能性があります。
そうなんですか。全然知りませんでした。
「6の文字コードを間違いなく出力する」と思っていました。
理解できましたと思います。
Posted: 2015年8月31日(月) 23:32
by el
みなさん回答ありがとうございます。
そして、フォーラムルールを破り書き込みすみませんでした。
質問の意図としては管理人さんのおっしゃっている通りです。
疑問解決のために誤ったコードを書きました。
お二方の回答から、自分が誤って認識していただろう点が
浮き彫りになりました。本当にありがとうございました。
Re: 超初心者、変換指定子についての疑門
Posted: 2015年9月01日(火) 09:34
by el
解決をつけわすれてたのでつけさせて頂きます。