超初心者、変換指定子についての疑門

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

超初心者、変換指定子についての疑門

#1

投稿記事 by el » 10年前

例えば

#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』とコンソールへ表示されそうだとなんとなく思うのですが
なぜそうならないんでしょう。
コンピュータとのやり取りの流れが認識できていないので
起こる疑問かと思いますが、教えていただけませんか?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 超初心者、変換指定子についての疑門

#2

投稿記事 by Dixq (管理人) » 10年前

まず、フォーラムルールにあるように、ソースコードは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

と表示されるはずです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 超初心者、変換指定子についての疑門

#3

投稿記事 by みけCAT » 10年前

まず、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型として表示するという過程を通って
ここは正しいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 超初心者、変換指定子についての疑門

#4

投稿記事 by Dixq (管理人) » 10年前

間違っていることは承知です。たまたまではないし、0初期化したのも意図的です。
提示されたソースコードを実行したらどうなるかという疑問への回答です。
質問者が%cにintを渡すべきではないが疑問解消のため意図的に書いているという前提で回答しています。

box
記事: 2002
登録日時: 14年前

Re: 超初心者、変換指定子についての疑門

#5

投稿記事 by box » 10年前

みけCAT さんが書きました: 6の文字コードも出力されない可能性があります。
そうなんですか。全然知りませんでした。
「6の文字コードを間違いなく出力する」と思っていました。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

el

理解できましたと思います。

#6

投稿記事 by el » 10年前

みなさん回答ありがとうございます。
そして、フォーラムルールを破り書き込みすみませんでした。
質問の意図としては管理人さんのおっしゃっている通りです。
疑問解決のために誤ったコードを書きました。
お二方の回答から、自分が誤って認識していただろう点が
浮き彫りになりました。本当にありがとうございました。

el

Re: 超初心者、変換指定子についての疑門

#7

投稿記事 by el » 10年前

解決をつけわすれてたのでつけさせて頂きます。

閉鎖

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