删除换行符

问题描述 投票:0回答:2

所以我试图从一个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 . . .");  
}
c unix named-pipes
2个回答
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。这样可以避免需要null终止。


0
投票

甚至strlen工作,你需要char *null终止。截至目前,您通过将非null终止字符串传递给strlen来调用未定义的行为。

因此,替换

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

通过

   buff[ret_val ] = '\0';  

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


同时删除以下行

ret_val = 1;

因为它覆盖了read的返回值。

© www.soinside.com 2019 - 2024. All rights reserved.