【问题标题】:String Comparison not working C字符串比较不起作用C
【发布时间】:2013-01-28 17:06:02
【问题描述】:

我今天在 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;
    }
}

问候

【问题讨论】:

  • 如果数据与您声称的一样,那么strcmp 将返回0
  • read 不会 0 终止。
  • “我也查过了”[怎么样?]

标签: c string string-comparison


【解决方案1】:

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,同时将读取的每个字节附加到数组中。

【讨论】:

  • 好的,所以我尝试将输入字符串与单个空格连接起来,结果字符串将以空值结尾,但仍然无法正常工作
  • @JamesAflred,这里没有连接。 buf[readBytes] = 0; 行将空终止符分配给该索引。分配空终止符后打印出buf,检查内容是否符合您的预期。
【解决方案2】:

strcmp 将比较两个以空字符结尾的字符数组。 read 不会以空值终止您从文件描述符中读取的缓冲区。除非您知道文件中应该有 '\0' 字节,否则您可以尝试改用 strncmp(buf,"exitChat", sizeof("exitChat")-1)

【讨论】:

    【解决方案3】:

    因为你有readbytes,所以只比较那么多字节:

    if(!strncmp(buf,"exitChat",readbytes))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 2014-04-03
      • 2012-01-22
      • 2017-12-07
      • 1970-01-01
      相关资源
      最近更新 更多