所以我试图从一个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 . . .");
}
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
。这样可以避免需要null终止。
甚至strlen
工作,你需要char *
被null
终止。截至目前,您通过将非null
终止字符串传递给strlen
来调用未定义的行为。
因此,替换
str_len = strlen(buff);
buff[str_len] = '\0';
通过
buff[ret_val ] = '\0';
在将ret_val
用作索引之前添加边界条件检查。
同时删除以下行
ret_val = 1;
因为它覆盖了read
的返回值。