C言語関係掲示板

過去ログ

No.18. 文字処理関数の引数の型


はじめまして。
C言語初心者です。
こちらのHPを見ながら勉強させていただいています。
第7章の7-2文書処理関数のところで、変数はすべてint型となっているのは、どうしてなのでしょうか?
例文を見てフ゜ロク゛ラムを作成したところ、英大文字を1文字入力しても、メッセージがでる文字と、でない文字があるんです。

#include <stdio.h>
#include <ctype.h>

int main(void)
{
int c;
scanf("%c",&c);

if(isupper(c)!=0)
printf("英大文字入力");


文字型はcharかintか

実はこれは処理系によって異なるんですね。
printf("%d",sizeof('A')); で 1 が出力されたらchar型、2 ならint型になるでしょう。
文字処理関数の引数がint型なのは仕様なんですが、要はint型なら、char型、int型
に関わらず、文字を扱えると言うことなんだと思います。

ところが、scanf で %c を指定すると、1バイトのデータしか入力しないのです。
'A' を入力すれば、0x41ですよね。
それを、int で宣言するので、ゴミが入って、例えば宣言時に c が0xffff だったと
しますよね。それに0x41だけを入力するので、0xff41になって、isupperでは英大文字
としては判断しなくなってしまうのですよ。

回避策ですが、scanf を使わずに、getchar を使う、もしくは、宣言時に c を
0で初期化するかしてみてください。


ありがとうございました。
cを初期化したらちゃんと動くようになりました。
とっても勉強になりました。
これからも頑張っていきたと思いますので、
宜しくお願いします。


今確認したら、
7−2の例はscanf("%c",&c);を使ってますね。
修正しておきます。誤動作するのを教えてもらって、良かったです。

戻る


「初心者のためのポイント学習C言語」 Last modified:2001.7.25
Copyright(c) 2000-2002 TOMOJI All Rights Reserved