Сравнение пользовательского ввода с предопределенным массивом символов на языке программирования C - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть следующий код, который должен получить пользовательский ввод как команды, а затем проверить, является ли команда предопределенной.Однако для любой введенной команды выводом является " Вы обратились за помощью ".Я подумал, что проблема может быть связана с тем, как я сравниваю строку ввода пользователя с заданными строками, но мне все еще нужна помощь в решении проблемы.

char command[10];
char set[10];
char set1[10];
strcpy(set, "help");
strcpy(set1, "thanks");

int a = 0;
while (a != 1)//the program should not terminate.
{
   printf("Type command: ")
   scanf("%s", command);
   if (strcmp(set, command))
   {
       printf("You asked for help");
   }
    else if (strcmp(set1, command))
   {
       printf("You said thanks!");
   }
   else
   {
       printf("use either help or thanks command");
   }
}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Прежде всего, всегда ограничивайте длину ввода при использовании scanf(), например

 scanf("%9s", command);

для массива из 10 элементов char, чтобы избежать переполнения буфера из-за слишком длинных входов.

Тем не менее, логика блока if...else работает следующим образом:

if (expression is true) {         // produce a non-zero value, truthy 
   execute the if block
   }
else {                             // expression is falsy
   execute the else block
   }

В вашем случае управляющим выражением является strcmp(set, command).

Теперь укажитеобратите внимание, что в случае совпадения , strcmp() возвращает 0, в случае несоответствия возвращает ненулевое значение.

Таким образом,

  • Если ваш ввод соответствует ожидаемой предварительно выбранной строке, вы получите 0 - который будет оцениваться как falsy и против вашегоожидание, оно перейдет к части else.
  • Если ваш ввод не соответствует ожидаемой предварительно выбранной строке, вы получите ненулевое значение, которое будетоценивается как верный и еще раз, блок if будет выполнен ошибочно.

Итак, в вашем случае вам нужно изменить условие, чтобы отменить возвращаемое значениеуу, как

   if (!strcmp(set, command))
   {
       printf("You asked for help");
   }
    else if (!strcmp(set1, command))
   {
       printf("You said thanks!");
   }
   else
   {
       printf("use either help or thanks command");
   }
0 голосов
/ 21 ноября 2018
if (strcmp(set, command))

должно быть

if (strcmp(set, command) == 0)

Причина в том, что strcmp возвращает ненулевое значение, если LHS или RHS больше, и ноль, если они равны.Поскольку в условном выражении ноль оценивается как «ложь», вам придется явно добавить тест == 0, чтобы сделать его истинным в том смысле, в котором вы ожидаете, что является равенством.

...