strncmp无法正确匹配

时间:2013-02-01 12:43:21

标签: c++ c strncmp

我不知道如何在C中使用字符串:

这是我服务器的一部分: 即使我通过telnet提供字符'/',也不会调用break。

理想情况下,这会缓冲一个名为get的字符串,通过一遍又一遍地向它添加字符串ch直到它到达某个字符,或者更好的是,一个字符串(但现在写它应该与字符一起使用)但我很想知道如何使用字符串来完成它所以我可以设计一个使用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

5 个答案:

答案 0 :(得分:3)

此:

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

调用未定义的行为。您将&ch,即单个char的地址传递给期望字符串指针的函数。因此,它将从&ch的地址开始查看最多5个字符,当然这只是一个数据字符。

您的整个读取逻辑非常奇怪,它应该执行更大的读取,而不是一次一个字符。

答案 1 :(得分:2)

该行

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

不正确

ch是一个字符但你比较5个字符。第二个参数必须是字符串而不是字符。

如果是拼写错误并且您的意思是get那么您需要在收到最后一个字符串后终止字符串 字符以使用get作为参数。或者使用memcmp来比较字节,无论是否 他们是不是字符串。

答案 2 :(得分:0)

试试这个并看看。好像你正在将char(str)数组与char(ch)

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

答案 3 :(得分:0)

你改为:

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

这比使用函数(例如strncmp

更快

答案 4 :(得分:0)

read( client, &ch, 1 ) < 0

为什么< 0?似乎所有内容都在代码中完成,而read则返回读取的字节数。