- ベストアンサー
文字列操作
テキストを読みこんで、そのテキストにある単語を抽出するプログラムを作ろうとしています。単語の区切り文字はスペースかタブで、1文字ずつ読みこんで行こうともいます。 しかし、1文字ずつ読みこむ関数fgetcは返値がint型のようです。1文字ずつよみこみながら読みこんだ文字がスペースかタブで無いか見たいのですが、fgetcのint型返り値をchar文字列と比較するにはどうしたら良いでしょうか。
- みんなの回答 (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型を返す理由はこのあたりにあります。
その他の回答 (5)
int c = fgetc(fp); if (c == ' ' || c == '\t') { // 読み込んだ1文字がスペースまたはタブだったら … } 単純に,これで OK です。
- crm
- ベストアンサー率50% (2/4)
比較元の文字(' 'や'\t')を文字コード(0x20や0x09)で指定したらどうでしょうか。 (VisualC++6.0の場合、シングルコーテーションで指定した場合は、char型と、逆に16進数で指定した場合は、int型と認識されています。) もしくは、fgetcの戻り値をchar型へキャストしてはどうでしょうか。
- nagare
- ベストアンサー率33% (280/831)
そうそう 漢字は”考慮しない”でいいんですよね? 考慮するのであれば、fgetcではつらいです
お礼
ありがとうございました。 漢字は考慮しないので、大丈夫と思います。
- nagare
- ベストアンサー率33% (280/831)
>関数fgetcは返値がint型のようです そうです アスキーコードが戻り値です >fgetcのint型返り値をchar文字列と比較するにはどうしたら良いでしょうか。 アスキーコードで判定するか、文字変換後判定すればいいです タブ=0x09,'\t' SP =0x20,' ' アスキーコード表 http://hp.vector.co.jp/authors/VA008536/data/ascii.html MSDN http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_crt_fgetc.2c_.fgetwc.2c_._fgetchar.2c_._fgetwchar.asp
お礼
ありがとうございました。 アスキーコード表は参考になりました。
- shirousa01
- ベストアンサー率36% (36/98)
経験者といっても少しだけなんですけどね。 たしか、char型は2バイトの数値を格納する変数だったと思います。 文字は2バイトなので文字列を扱うのに便利だからchar型といったはずです。 VBなどと違い同じ数値のデータなので特に気にすることなく比較演算子を使えば出来ると思います。 …たしか。 ↑自信かなり無いです(泣)。
お礼
ありがとうございました。
お礼
ありがとうございました。 ループのさせ方が、参考になりました。