删除结束符

时间:2019-02-14 20:00:05

标签: c unix named-pipes

因此,我试图从fifo文件(基本上是一个命名管道)中进行读取,但是当我在进行字符串比较时,使用strcmp()并不能提供预期的输出。

我尝试使用strlen()获取消息的长度,并将该字符显式设置为'\ 0',但是仍然无法正常工作。

ret_val = read(fd,buff,BUFFSIZE);
// where buff is the character array reading from the fd of the fifo-file.
// and buffsize has been defined as 32
ret_val = 1;
str_len = strlen(buff);  
buff[str_len] = '\0';  
ret_val = strcmp(buff,"bye");  
if(!ret_val)  {
    printf("\nProgram is terminating . . .");  
}

2 个答案:

答案 0 :(得分:2)

str_len = strlen(buff);  
buff[str_len] = '\0';

这是不对的。 read()不能不终止buff。因此,您无法在其上调用strlen()。如果是这样,您根本就不需要这样做。

使用返回值read()并将null终止:

    ret_val = read(fd,buff,BUFFSIZE);

    if (ret_val != -1)
    {
        buff[ret_val] = '\0';
    }

然后您可以执行strcmp

您还需要注意另一种情况:如果read()返回BUFFSIZE,则没有空间添加空终止符。因此,您可以截断buff(丢失最后一个字符),或者将BUFFSIZE - 1传递给buf。

或者,您可以使用memcmp。这样也可以避免终止为空。

答案 1 :(得分:0)

即使strlen工作,也需要char *null终止。到目前为止,您正在通过将非null终止的字符串传递给strlen来调用未定义的行为。

因此,替换

str_len = strlen(buff);  
buff[str_len] = '\0';

作者

   buff[ret_val ] = '\0';  

在将ret_val用作索引之前添加边界条件检查。


也删除下面的行

ret_val = 1;

正在覆盖read返回值。