性格いい人が優勝

テキストを読みこんで、そのテキストにある単語を抽出するプログラムを作ろうとしています。単語の区切り文字はスペースかタブで、1文字ずつ読みこんで行こうともいます。
しかし、1文字ずつ読みこむ関数fgetcは返値がint型のようです。1文字ずつよみこみながら読みこんだ文字がスペースかタブで無いか見たいのですが、fgetcのint型返り値をchar文字列と比較するにはどうしたら良いでしょうか。

A 回答 (6件)

基本的にyoppiiさんの回答で合っていると思います。

ただ、一つ付け加えるなら
「1文字しか対応されていない例なので、適宜ループする必要がある」ということです。
あえて例を書き加えるならば(fopenとfcloseを今回もはしょります)
int c = fgetc(fp);

while(!feof(fp))
{
 if (c == ' ' || c == '\t') { /* 読み込んだ1文字がスペースまたはタブだったら */
   …
 }
 c = fgetc(fp);
}

あと、char型って1バイト数値を扱うもので2バイトを扱うのはshort型です。
かといって漢字を扱うのにshort型は逆に適していません。またint型とlong型は
処理系によって扱うバイト数も異なります。

さらに、fgetc関数の戻り値をchar型にキャストする方法も紹介されていますが
これは推奨しません。1つの回答としては問題ないように思えますが、万一
ファイルアクセスエラーとなった場合にエラーなのか文字コード(特に漢字)なのか
判別できなくなるからです。
#int型を返す理由はこのあたりにあります。
    • good
    • 0
この回答へのお礼

ありがとうございました。
ループのさせ方が、参考になりました。

お礼日時:2003/08/17 15:28

int c = fgetc(fp);



if (c == ' ' || c == '\t') { // 読み込んだ1文字がスペースまたはタブだったら
  …
}

単純に,これで OK です。
    • good
    • 0

比較元の文字(' 'や'\t')を文字コード(0x20や0x09)で指定したらどうでしょうか。


(VisualC++6.0の場合、シングルコーテーションで指定した場合は、char型と、逆に16進数で指定した場合は、int型と認識されています。)

もしくは、fgetcの戻り値をchar型へキャストしてはどうでしょうか。
    • good
    • 0

そうそう 漢字は”考慮しない”でいいんですよね?


考慮するのであれば、fgetcではつらいです
    • good
    • 0
この回答へのお礼

ありがとうございました。
漢字は考慮しないので、大丈夫と思います。

お礼日時:2003/08/17 15:26

>関数fgetcは返値がint型のようです


そうです アスキーコードが戻り値です

>fgetcのint型返り値をchar文字列と比較するにはどうしたら良いでしょうか。
アスキーコードで判定するか、文字変換後判定すればいいです
タブ=0x09,'\t'
SP =0x20,' '

アスキーコード表
http://hp.vector.co.jp/authors/VA008536/data/asc …

MSDN
http://www.microsoft.com/japan/msdn/library/defa …
    • good
    • 0
この回答へのお礼

ありがとうございました。
アスキーコード表は参考になりました。

お礼日時:2003/08/17 15:25

経験者といっても少しだけなんですけどね。


たしか、char型は2バイトの数値を格納する変数だったと思います。
文字は2バイトなので文字列を扱うのに便利だからchar型といったはずです。
VBなどと違い同じ数値のデータなので特に気にすることなく比較演算子を使えば出来ると思います。
…たしか。
↑自信かなり無いです(泣)。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2003/08/17 15:24

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