因此,我试图从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 . . .");
}
答案 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
返回值。