0

Cで文字列を操作する方法がわかりません。

これが私のサーバーの一部です。telnetを介して文字「/」を指定しても、ブレークが呼び出されることはありません。

理想的には、これは、文字列chを特定の文字に到達するまで、またはさらに良いことに文字列に到達するまで何度も追加することによって、getと呼ばれる文字列をバッファリングします(ただし、今は文字で動作するはずですが、i '文字列を使用してそれを行う方法を知りたいので、区切り文字としてCR + LFを使用するプロトコルを設計できます)。

   char ch;
    int index = 0;
    char get[1024];
    const char str[] = "/";

    if ( read( client, &ch, 1 ) < 0 )
    {
        perror( "read" );

        get[index] = ch;
        index++;

        int compareResult = strncmp(str, &ch, 5);

        if(compareResult == 0){
            index = 0;
            close( client );
            printf( "server responded, connection closed" );
            break;
        }
    }

    //if ( write( client, &ch, 1 ) < 0 ) { perror( "write" ); break; }

    printf( "got stuff" );

なぜそれは到達しないのですか

printf( "server responded, connection closed" );

ライン?

サーバーの完全なコード:http://pastebin.com/j5tX3TEx

4

5 に答える 5

3

これ:

int compareResult = strncmp(str, &ch, 5);

未定義の動作を呼び出します。文字列ポインタを期待する関数&chにシングルのアドレスを渡しています。したがって、のアドレスから始まる最大5文字を調べます。これは、もちろんデータの1文字にすぎません。char&ch

読み取りロジック全体が非常に奇妙です。一度に1文字ではなく、より大きな読み取りを実行する必要があります。

于 2013-02-01T12:49:55.963 に答える
2

この線

int compareResult = strncmp(str, &ch, 5);

正しくありません

chは1文字ですが、5文字を比較します。2番目の引数は、文字ではなく文字列である必要があります。

それがタイプミスであり、あなたが意図した場合、引数としてget使用するために、最後の文字を受け取った後に文字列を\0終了する必要があります。または、文字列であるかどうかに関係なく、バイトを比較するためにget使用します。memcmp

于 2013-02-01T12:49:05.037 に答える
0

これを試して見てください。char(str)の配列をchar(ch)と比較しているようです

if(ch == '/'){
    index = 0;
    close( client );
    printf( "server responded, connection closed" );
    break;
}
于 2013-02-01T12:49:13.123 に答える
0

代わりにこれを行います:

if(ch == '/'){
      index = 0;
      close( client );
      printf( "server responded, connection closed" );
      break;
}

これは、関数(などstrncmp)を使用するよりも高速です

于 2013-02-01T12:49:26.943 に答える
0
read( client, &ch, 1 ) < 0

なぜ< 0ですか?readが読み取られたバイト数を返す間、すべてがコード内で行われているようです。

于 2013-02-01T12:49:37.490 に答える