Удаление конечного символа - PullRequest
0 голосов
/ 14 февраля 2019

Так что я пытаюсь читать из fifo-файла (в основном именованный канал), но когда я делаю сравнение строк, используя strcmp(), это не дает ожидаемого результата.

Iпопытался получить длину сообщения с помощью 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 голосов
/ 14 февраля 2019
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.Это также избавит от необходимости прерывания нуля.

0 голосов
/ 14 февраля 2019

Даже strlen для работы вам нужно char * чтобы быть null прекращенным.На данный момент вы вызываете неопределенное поведение, передавая не null завершенную строку в strlen.

Таким образом, замените

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

на

   buff[ret_val ] = '\0';  

Addпроверка граничного условия для ret_val перед использованием его в качестве индекса.


Также удалите строку ниже

ret_val = 1;

Поскольку она перезаписывает возвращаемое значение read.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...