プロが教えるわが家の防犯対策術!

C言語の<ctype.h>のisspace()について教えてください。

まだ初心者なので、変な質問でしたらすみません。
ライブラリで用意されているisspace()関数があります。
空白類の文字判定を行えるとあり、引数はint型で指定することになっています。

そこで疑問なのですが文字列をgetcで取ってきた時にcはEOFの時にマイナスを取るわけですが、問題ないのでしょうか?

例えば
int c;
while( !isspace( c = getc( fp )) && c != EOF ){・・・

getcを(unsigned char)ででもキャストすると解消するとは思いますが、問題ないのならば加えたくありません・・。以上ですが、分かりにくい説明でご迷惑おかけします。
よろしくお願い致します。

A 回答 (3件)

> そこで疑問なのですが文字列をgetcで取ってきた時にcはEOFの時にマイナスを取るわけですが、


> 問題ないのでしょうか?

K&R 2 によると,
「各関数に対し,引数は int で与える。
 その値は EOF か,あるいは unsigned char として表現できるものでなければならず,
 戻り値は int となる。」
とありますから問題ないでしょう。(「各関数」というのは ctype.h で宣言された各関数のことです。)

心配なら先に EOF でないことをチェックしておけばいいです。
    • good
    • 0
この回答へのお礼

早急なご回答どうもありがとうございます。
すみません、yoppiiさんに言われた後調べたら載っていました。納得です!!

お礼日時:2003/09/26 18:44

こんにちは。

どこがわかりませんか?getc のプロトタイプ宣言は
int getc(FILE *stream)
ですから、ファイルストリームから読み込んだ
文字コードの値を int にキャストして戻してくれるわけです。
ですからキャストの必要はありません、というか EOF との比較ができなくなりますので
してはいけません。

また int は符号付き(signed)ですから、EOF(普通は -1)も楽に格納できます。
    • good
    • 0
この回答へのお礼

早急なご回答どうもありがとうございます。
すみません、主旨がわかりにくい質問ですよね・・。
isspace()の引数に-1を入れてもいいのかどうかが疑問でした。。。失礼しました^^;

お礼日時:2003/09/26 18:42

isspace()の引数が対象外の値の場合は0を返すことになっているようですので、問題は無いとは思いますが。



心配でしたら、以下のように書いてみてはどうでしょうか

int c;
while( (c=getc(fp)) != EOF && !isspace(c) )
{
.......

この場合、先に (c=getc(fp)) != EOF がFALSEになった段階で、次の !isspace(c) は評価されなくなります。
    • good
    • 0
この回答へのお礼

どうもありがとう御座います。
早急なお答え感謝です。

お礼日時:2003/09/26 18:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!