Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-将字符数组与字符串进行比较_C_String_Compare_Strcmp - Fatal编程技术网

C-将字符数组与字符串进行比较

C-将字符数组与字符串进行比较,c,string,compare,strcmp,C,String,Compare,Strcmp,我有一个套接字服务器,它应该接收消息并写一个答案。对于一些消息,我想发送一个特殊的答复。例如,如果消息是“你好”,我想回答“你好!”。以下是我代码的一部分: ... char in[2000]; char out[2000]; ... while((read_size = recv(fd, in, 2000, 0)) > 0){ if(strcmp(in, "Hello") == 0){ strcpy(out, "Hi!\n"); } else

我有一个套接字服务器,它应该接收消息并写一个答案。对于一些消息,我想发送一个特殊的答复。例如,如果消息是“你好”,我想回答“你好!”。以下是我代码的一部分:

...
char in[2000];
char out[2000];
...
while((read_size = recv(fd, in, 2000, 0)) > 0){

    if(strcmp(in, "Hello") == 0){

        strcpy(out, "Hi!\n");

    }
    else{

        strcpy(out, in);

    }

    write(fd, out, strlen(out));

}
...
但是strcmp()在这里不能正常工作。因为当我输入
“Hello”
时,在
in
变量中不仅有
“Hello”
,因为长度是2000。但是,如果收到的消息是
“Hello”
,我现在如何检查呢?

使用strncmp函数,该函数比较字符串的前n个字节:

if (strncmp(in, "Hello", strlen("Hello")) == 0) ...
使用strncmp函数,比较字符串的前n个字节:

if (strncmp(in, "Hello", strlen("Hello")) == 0) ...

recv()示例中的in和out的视觉匹配缓冲区大小在else分支中可能不太匹配(有人会尝试添加或查找缓冲区中不存在的空终止符,如果所有2000个字符都已填充,则无法添加该空终止符。最好使用strncpy而不是strcpy。请参阅示例
recv()
不为null终止缓冲区。添加到@EOF:socket服务器应只侦听好友;-)示例中的in和out的视觉匹配缓冲区大小可能与else分支中的不匹配(有人会尝试添加或查找不在缓冲区中的空终止符,如果所有2000个字符都已填充,则无法添加。最好使用strncpy而不是strcpy。例如,请参阅如果在
recv()
之前,缓冲区包含
“xxxxxxo\0”
,并且
recv()
仅接收到
“Hell”会发生什么情况
?您的
strncmp()
会错误地报告
recv()
接收到
“Hello”
。它似乎可以使用strlen(“Hello”)作为n。我也尝试使用read\u大小,但不起作用。@EOF在对您的问题的评论中给出了答案。如果在
recv()
之前,缓冲区包含
“xxxxo\0”
,和
recv()
只收到
“地狱”
?您的
strncmp()
会错误地报告
recv()
收到了
“Hello”
。它似乎与strlen(“Hello”)一样有效。我也用read\u大小尝试过,但不起作用。@EOF在对您的问题的评论中给出了答案。