• ベストアンサー

read()で読みこんだ文字列の比較について

実行環境はLinuxで、ディストリビューションはturboLinuxです。 strcmpで文字列の比較ができるのですが、何故かreadで読み込んだ文字列は比較できません。 何故なのでしょうか。ちなみにコードは下です read(sock_ipadrc,&Buf,sizeof(Buf)); if(!strcmp("GETADR",Buf)){ printf("等しい"); }

質問者が選んだベストアンサー

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.9

コードを拝見しました。2点程問題があるようです。 (1) read() の fd に相当する変数名が sock_ipadrc となっていますが、ソケットの場合、ファイルと違って必ず sizeof(Buf) 分読めるとは限りませんので(読める場合もあるので、コードは正しいと思い込まないようにしてください))、sizeof(Buf) に満たなかった場合、再度読み込むというような処理が必要です。 (2) で、Buf に sizeof(Buf) 分読み込めたとして、以下のようにすれば strncmp() を使えば、最後の '?0' を気にしなくても大丈夫です。 if( !strncmp( "GETADR", Buf, strlen( "GETADR" ) ) { ... }

その他の回答 (8)

  • ussii46
  • ベストアンサー率0% (0/4)
回答No.8

質問者様の質問の範疇からは外れてしまいますが… No.7様が提示されたコードは、質問者様の想定している状況では恐らく動きますが、 実際のプログラム中に組み込むにはかなり大きな問題を含んでいます。 1.sizeof(Buf)分のデータを読み込むとBuf[sizeof(Buf)]に0を書き込むことになり、  他のメモリ領域を破壊します。 2.readがエラー終了した場合、Buf[-1]に書き込むことになり  他のメモリ領域を破壊します。 なお、lenの値による分岐を設ければ他のメモリ領域破壊は回避できますが 1はBufを全て使い切り、?0を入れる領域が無くなります。 そのため、strcmp以外のライブラリ関数を使ったり、 バッファを他の領域にコピーし直すような対処が必要となります。

  • moritan2
  • ベストアンサー率25% (168/670)
回答No.7

int len; len = read(sock_ipadrc,&Buf,sizeof(Buf)); Buf[len] = 0; とすればいいんじゃない?

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.6

No.1のお礼からするとBufの値をデバッガで確認していますか? Buf[6]が何になっているか確認ください。 これが'\0'でなければ文字列は等しくないです。 ソケット(?)から読み込んで終端文字('\0')まで読み込んでいる可能性は高くないと考えます。 あと一般論ですが、readの返値は変数に取ってチェックした方が良いと思いますよ。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.5

readって\0いれたっけ……?

  • ussii46
  • ベストアンサー率0% (0/4)
回答No.4

この辺をチェックすればよいかと。 ・Bufはread前にnull初期化されているか  readは読んだデータの最後にnullを付けません。  つまり、strcmpはBufをnullが出てくるまでBufを評価し続けます。 ・Buf内のデータがunicode文字列だったりしないか ・readの返り値を見て正しくread出来ているかをチェック  エラーが起こっているようならerrnoやperrorで調べる

  • ko_kinta
  • ベストアンサー率39% (43/109)
回答No.3

readした文字列の終端に改行があるのでは? read()の戻り値がBufに読み込まれた文字列長なので、それで確認してみてください。 文字列長が間違いないとしたら、一文字ずつループして比較してみるしかないですね。

  • salf
  • ベストアンサー率42% (27/64)
回答No.2

>確認してみました。 >やっぱりどうみても等しいですね。 文字列の前後にスペースが入ってるとかないですか?

  • salf
  • ベストアンサー率42% (27/64)
回答No.1

比較結果が等しくならないんですよね? とりあえず、Buf に入っている文字を表示してみて確認されてはどうでしょうか?

tukai
質問者

お礼

確認してみました。 やっぱりどうみても等しいですね。

関連するQ&A

専門家に質問してみよう