電子書籍の厳選無料作品が豊富!

実行環境はLinuxで、ディストリビューションはturboLinuxです。


strcmpで文字列の比較ができるのですが、何故かreadで読み込んだ文字列は比較できません。
何故なのでしょうか。ちなみにコードは下です

read(sock_ipadrc,&Buf,sizeof(Buf));

if(!strcmp("GETADR",Buf)){

printf("等しい");

}

A 回答 (9件)

コードを拝見しました。

2点程問題があるようです。

(1) read() の fd に相当する変数名が sock_ipadrc となっていますが、ソケットの場合、ファイルと違って必ず sizeof(Buf) 分読めるとは限りませんので(読める場合もあるので、コードは正しいと思い込まないようにしてください))、sizeof(Buf) に満たなかった場合、再度読み込むというような処理が必要です。

(2) で、Buf に sizeof(Buf) 分読み込めたとして、以下のようにすれば strncmp() を使えば、最後の '?0' を気にしなくても大丈夫です。

if( !strncmp( "GETADR", Buf, strlen( "GETADR" ) ) {
...
}
    • good
    • 0

質問者様の質問の範疇からは外れてしまいますが…



No.7様が提示されたコードは、質問者様の想定している状況では恐らく動きますが、
実際のプログラム中に組み込むにはかなり大きな問題を含んでいます。

1.sizeof(Buf)分のデータを読み込むとBuf[sizeof(Buf)]に0を書き込むことになり、
 他のメモリ領域を破壊します。
2.readがエラー終了した場合、Buf[-1]に書き込むことになり
 他のメモリ領域を破壊します。

なお、lenの値による分岐を設ければ他のメモリ領域破壊は回避できますが
1はBufを全て使い切り、?0を入れる領域が無くなります。
そのため、strcmp以外のライブラリ関数を使ったり、
バッファを他の領域にコピーし直すような対処が必要となります。
    • good
    • 0

int len;



len = read(sock_ipadrc,&Buf,sizeof(Buf));
Buf[len] = 0;

とすればいいんじゃない?
    • good
    • 0

No.1のお礼からするとBufの値をデバッガで確認していますか?


Buf[6]が何になっているか確認ください。
これが'\0'でなければ文字列は等しくないです。
ソケット(?)から読み込んで終端文字('\0')まで読み込んでいる可能性は高くないと考えます。

あと一般論ですが、readの返値は変数に取ってチェックした方が良いと思いますよ。
    • good
    • 0

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

    • good
    • 0

この辺をチェックすればよいかと。


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

readした文字列の終端に改行があるのでは?


read()の戻り値がBufに読み込まれた文字列長なので、それで確認してみてください。

文字列長が間違いないとしたら、一文字ずつループして比較してみるしかないですね。
    • good
    • 0

>確認してみました。


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

比較結果が等しくならないんですよね?



とりあえず、Buf に入っている文字を表示してみて確認されてはどうでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/07/07 15:23

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