0

今日、cプログラミングで奇妙な問題に遭遇しました。サーバークライアント通信用のプログラムを作成し、それに文字列比較関数を適用しましたが、文字列をbuf内のものと比較すると、この関数は機能しません。また、bufのデータが数回の反復後に入力したものと異なるかどうかを確認しましたが、結果は否定的であり、データは入力したものと同じです。では、なぜ機能しないstrcmpのですか。コードは次のとおりです。

char buf[1024];
while(1)
{
    int readbytes=read(communFd,buf,1024);

    write(STDOUT_FILENO,buf,readbytes);


   if(!strcmp(buf,"exitChat"))
    {
        printf("Chat terminating...\n");
        break;
    }
}

よろしく

4

3 に答える 3

6

read()strcmp()に依存するバッファをnullで終了しません。これは、明示的に行う必要があります。

int readbytes=read(communFd,buf,1023); /* Read one less for null terminator. */
if (readBytes != -1)
{
    buf[readBytes] = 0;
    if(!strcmp(buf,"exitChat"))
    {
    }
}

または、他の人が述べているように、ヌルターミネータ文字の存在に依存しない別の関数を使用します。

read()要求されたバイト数が読み取られることを保証するものではなく、読み取られるバイト数が少ない場合はエラーとは見なされないことに注意してください。リンクされたリファレンスページから:

成功すると、読み取られたバイト数が返され(ゼロはファイルの終わりを示します)、ファイルの位置はこの数だけ進められます。この数が要求されたバイト数よりも小さい場合はエラーではありません。これは、たとえば、現在実際に使用可能なバイト数が少ないため(ファイルの終わりに近かったため、パイプまたは端末から読み取っているため)、またはread()が信号。エラーの場合、-1が返され、errnoが適切に設定されます。この場合、ファイルの位置(存在する場合)が変更されるかどうかは指定されません。

完全なメッセージが受信されたことを確認するには、送信されるテキストにデータを追加して、受信者が完全なメッセージを受信したことを認識できるようにする必要があります。これは次のようになります。

  • テキストの前にその長さを付けます。
  • 番兵の値を使用してメッセージの終わりを示します。たとえば、\n文字で終わりを示します。コードの構造は、読み取られた各バイトを配列に追加しているときにが見つかるread()まで、ループで呼び出すように変更されます。\n
于 2013-01-28T17:08:52.077 に答える
2

strcmp2つのnullで終了するchar配列を比較します。 readファイル記述子から読み取ったバッファをnullで終了しません。'\0'ファイルにバイトが含まれている必要があることがわかっていない限り、strncmp(buf,"exitChat", sizeof("exitChat")-1)代わりに使用してみてください。

于 2013-01-28T17:09:30.713 に答える
1

あなたが持っているのでreadbytes、その数のバイトだけを比較してください:

if(!strncmp(buf,"exitChat",readbytes))
于 2013-01-28T17:09:51.813 に答える