将用户输入与C编程语言中的预定义字符数组进行比较

时间:2018-11-21 07:00:43

标签: c strcmp

我有以下代码,应该将用户输入作为命令,然后检查命令是否已预定义。但是,对于输入的任何命令,输出为“ 您寻求帮助”。 我认为问题可能与我将用户输入的字符串与设置的字符串进行比较的方式有关,但是我仍然需要帮助解决问题。

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 :(得分:8)

if (strcmp(set, command))

应该是

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

原因是strcmp如果LHS或RHS较大,则返回非零值;如果相等,则返回零。由于零在条件中的结果为“假”,因此您必须显式添加== 0测试以使其符合您的期望,即相等。

答案 1 :(得分:1)

首先,始终在使用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)

现在,请注意,如果 match strcmp()返回0,如果 match ,则返回a非零值。

因此

  • 如果您输入的内容匹配,则您将得到一个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");
   }