我今天在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;
}
}
此致
答案 0 :(得分:6)
read()
不会终止strcmp()
所依赖的缓冲区,您必须明确地执行此操作:
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
,同时将每个字节读取附加到数组。答案 1 :(得分:2)
strcmp
将比较两个以null结尾的char数组。 read
将不会终止从文件描述符中读取的缓冲区。除非您知道文件中应该有'\0'
字节,否则您可以尝试使用strncmp(buf,"exitChat", sizeof("exitChat")-1)
。
答案 2 :(得分:1)
由于你有readbytes
,只比较那么多字节:
if(!strncmp(buf,"exitChat",readbytes))