strcmp не работает

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

printf("Enter command: ");
bzero(buffer,256);
fgets(buffer,255,stdin);

if (strcmp(buffer, "exit") == 0)
    return 0;

Если я ввожу "выход", он не входит в if, это связано с длиной"буфера"?

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

5 ответов


вы хотите:

strcmp(buffer, "exit\n")

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

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


fgets () возвращает строку "exit\n" -- в отличие от gets (), она сохраняет новые строки.


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

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

используя strncmp() потенциально позволяет "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;
/* get the string, being sure to leave room for a null byte */
if ( fgets(buf,sizeof(buf) - 1) == EOF )
{
  printf("error\n");
  exit(1);
}
/* absolutely always null-terminate, the easy way */
buf[sizeof(buf) - 1] = '';
/* compute the length, and truncate the \n if any */
len = strlen(buf);
while ( len > 0 && buf[len - 1] == '\n' )
{
  buf[len - 1] = '';
  --len;
}

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