strcmp не работает - PullRequest
       17

strcmp не работает

7 голосов
/ 09 июня 2009

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

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

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

Если я ввожу «exit», он не вводит if, это связано с длиной «buffer»?

Есть предложения?

Ответы [ 5 ]

21 голосов
/ 09 июня 2009

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

strcmp(buffer, "exit\n")

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

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

9 голосов
/ 09 июня 2009

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

5 голосов
/ 09 июня 2009

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

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

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

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

0 голосов
/ 09 июня 2009

Я бы порекомендовал вам убрать \ 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] = '\0';
/* compute the length, and truncate the \n if any */
len = strlen(buf);
while ( len > 0 && buf[len - 1] == '\n' )
{
  buf[len - 1] = '\0';
  --len;
}

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

0 голосов
/ 09 июня 2009

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

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

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

...