Я пытаюсь сравнить две строки. Один сохраненный в файле, другой полученный от пользователя (stdin).
Вот пример программы:
int main()
{
char targetName[50];
fgets(targetName,50,stdin);
char aName[] = "bob";
printf("%d",strcmp(aName,targetName));
return 0;
}
В этой программе, strcmp
возвращает значение-1, когда вход "bob"
. Почему это? Я думал, что они должны быть равными. Как я могу получить его так, чтобы они были?
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 ...
Поскольку fgets встраивает символ новой строки в переменную ] targetName
. Это отбрасывает сравнение.
fgets
добавляет новую строку к строке, так что вы получите bob \ n \ 0
, что не ' t то же, что bob \ 0
.
В основном из-за конца строки char на входе "n" в unix-подобной системе.
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));