strcmp не работает

Я знаю, что это может быть вопрос полностью новичков (я не дотронулся до C в течение длительного времени), но может кто-то сказать мне, почему это не работает?

printf("Enter command: "); bzero(buffer,256); fgets(buffer,255,stdin); if (strcmp(buffer, "exit") == 0) return 0; 

Если я вхожу в «exit», он не вводит if, имеет ли он отношение к длине «буфера»?

Какие-либо предложения?

Вы хотите сделать это:

strcmp(buffer, "exit\n")

То есть, когда вы вводите свою строку и нажимаете «enter», новая строка становится частью buffer .

Альтернативно, используйте strncmp (), который сравнивает только n символов строки

fgets () возвращает строку «exit \ n» – в отличие от gets (), она сохраняет символы новой строки.

Как говорили другие, по сравнению с "exit" происходит сбой, потому что fgets() включает в себя новую строку в буфере. Одна из его гарантий заключается в том, что буфер закончится новой строкой, если только введенная строка слишком длинная для буфера, и в этом случае она не заканчивается новой строкой. fgets() также гарантирует, что буфер nul завершен, поэтому вам не нужно обнулять 256 байтов, но только пусть fgets() использует 255 для получения этой гарантии.

Легкий ответ на сравнение с "exit\n" требовал, чтобы пользователь случайно не добавлял пробелы до или после слова. Не имеет значения, хотите ли вы заставить пользователя быть осторожным с командой exit , но может быть источником раздражения пользователя в целом.

Использование strncmp() потенциально позволяет "exited" "exit42" "exited" , "exit42" и т. Д., Чтобы соответствовать тому, где вы, возможно, не захотите. Это может работать против вас, особенно если некоторые допустимые команды являются префиксными строками других допустимых команд.

В общем случае часто бывает полезно отделить ввод-вывод, токенизацию, синтаксический анализ и действие в свои собственные фазы.

Согласитесь с Дейвом. Также вы можете использовать strncmp (). Затем вы можете установить длину для сравнения.

http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

http://www.cplusplus.com/reference/clibrary/cstring/strncmp/

Я бы порекомендовал вам вырезать \ n из конца строки, как это.

 char buf [256];
 int len;
 / * получить строку, не забудьте оставить место для нулевого байта * /
 if (fgets (buf, sizeof (buf) - 1) == EOF)
 {
   Е ( "ошибка \ п");
   выход (1);
 }
 / * абсолютно всегда null-terminate, простой способ * /
 buf [sizeof (buf) - 1] = '\ 0';
 / * вычислить длину и усечь \ n, если любой * /
 len = strlen (buf);
 while (len> 0 && buf [len - 1] == '\ n')
 {
   buf [len - 1] = '\ 0';
   --len;
 }

Таким образом, если вам нужно сравнить введенную строку с несколькими константами, вам не нужно добавлять \ n ко всем из них.