Я получил подтвержденный ответ от STL от MSFT :
В отличие от VC, GCC не реализовал random_device недетерминированно в Windows. Boost, поэтому вы можете использовать Boost.Random.
strcmp
является одной из немногих функций, которые имеют обратные результаты true и false ... если строки равны, результат равен 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|
+-+-+-+--+--+
Чтобы избавиться от новой строки, сделайте это. CAVEATS: Не используйте «strlen (aName) - 1», потому что строка, возвращаемая fgets, может начинаться с символа NUL, поэтому индекс в буфер становится равным -1:
aName[strcspn(aName, "\n")] = '\0';
+-+-+-+--+
|b|o|b|\0|
+-+-+-+--+
Теперь strcmp
должен возвращать 0 ...
fgets
добавляет новую строку в строку, поэтому вы получите bob\n\0
, который не совпадает с bob\0
.
fgets добавляет \n
к строке, которую вы извлекаете от пользователя, когда они нажимают Enter. Вы можете обойти это, используя strcspn
или просто добавив \n
в конец вашей строки, которую вы пытаетесь сравнить.
printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n");
fgets(temp, 8, stdin);
temp[strcspn(temp, "\n")] = '\0';
if(strcmp(temp, "ls") == 0 || strcmp(temp, "exit") == 0)
Это просто заменяет \n
на \0
, но если вы хотите быть ленивым, вы можете просто сделать это:
printf("Please enter put FILE_NAME (foo1, 2, or 3), ls, or exit: \n");
fgets(temp, 8, stdin);
if(strcmp(temp, "ls\n") == 0 || strcmp(temp, "exit\n") == 0)
Но это не так элегантно.
Поскольку fgets вставляет символ новой строки в переменную targetName
. Это отбрасывает сравнение.
fgets
читает до тех пор, пока не увидит новую строку, а затем вернется, поэтому при вводе bob в консоли targetName
содержит «bob\n», который не соответствует «bob». Из документации fgets: (добавлено выделение жирным шрифтом)
Читает символы из потока и сохраняет их как строку C в str до тех пор, пока не будут прочитаны символы (num-1) или не будет новой строки или конца -of-File, в зависимости от того, что наступит раньше. Символ новой строки заставляет fgets останавливать чтение, но считается действительным символом, и поэтому он включен в строку, скопированную на str. Нулевой символ автоматически добавляется в str после того, как символы, прочитанные для обозначения конца строки C.
blockquote>Перед сопоставлением нужно удалить новую строку из конца 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));
sizeof(targetName)
, не перекодировал его в fgets()
.
– mctylr
8 March 2010 в 22:27
В основном из-за конца строки char на входе «\n» в системе unix.