strcmp на чтении строки с fgets

Я пытаюсь сравнить две строки. Один сохраненный в файле, другой полученный от пользователя (stdin).

Вот пример программы:

int main()
{
    char targetName[50];
    fgets(targetName,50,stdin);

    char aName[] = "bob";
    printf("%d",strcmp(aName,targetName));

    return 0;
}

В этой программе, strcmp возвращает значение-1, когда вход "bob". Почему это? Я думал, что они должны быть равными. Как я могу получить его так, чтобы они были?

7
задан Gilles 'SO- stop being evil' 26 September 2012 в 09:35
поделиться

5 ответов

strcmp - одна из немногих функций, которые имеют обратные результаты: истина и ложь ... если строки равны, результатом будет 0, а не 1, как вы мог бы подумать ....

if (strcmp(a, b)) {
    /* Do something here as the strings are not equal */
} else {
    /* Strings are equal */
}

Говоря о fgets , есть вероятность, что к концу строки прикреплена новая строка ... вам нужно избавиться от нее ...

+-+-+-+--+--+
|b|o|b|\n|\0|
+-+-+-+--+--+

Чтобы избавиться от новой строки, сделайте следующее. ПРЕДОСТЕРЕЖЕНИЯ: не используйте "strlen (aName) - 1", потому что строка, возвращаемая fgets, может начинаться с символа NUL - таким образом, индекс в буфере становится - 1:

aName[strcspn(aName, "\n")] = '\0';

+-+-+-+--+
|b|o|b|\0|
+-+-+-+--+

Теперь strcmp должен вернуть 0 ...

9
ответ дан 6 December 2019 в 08:14
поделиться

Поскольку fgets встраивает символ новой строки в переменную ] targetName . Это отбрасывает сравнение.

2
ответ дан 6 December 2019 в 08:14
поделиться

fgets добавляет новую строку к строке, так что вы получите bob \ n \ 0 , что не ' t то же, что bob \ 0 .

1
ответ дан 6 December 2019 в 08:14
поделиться

В основном из-за конца строки char на входе "n" в unix-подобной системе.

1
ответ дан 6 December 2019 в 08:14
поделиться

fgets читает, пока не увидит новую строку, а затем вернется, поэтому, когда вы набираете в консоли bob, targetName содержит «bob \ n», которое не соответствует «bob». Из документации fgets: (жирный шрифт добавлен)

Считывает символы из потока и сохраняет их в виде строки C в str до тех пор, пока не будут прочитаны (num-1) символы или либо новая строка, либо конец -Файл достигнут, в зависимости от того, что наступит раньше. Символ новой строки останавливает чтение fgets, но считается допустимым символом и поэтому включается в строку, скопированную в str. Нулевой символ автоматически добавляется в str после прочитанных символов, чтобы обозначить конец строки C.

Перед сравнением необходимо удалить новую строку в конце targetName.

int cch = strlen(targetName);
if (cch > 1 && targetName[cch-1] == '\n')
   targetName[cch-1] = '\0';

или добавьте новую строку в тестовую строку.

char targetName[50];
fgets(targetName,50,stdin);

char aName[] = "bob\n";
printf("%d",strcmp(aName,targetName));
6
ответ дан 6 December 2019 в 08:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: