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

Comparing user input to a predefined array of characters in C programming language

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

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");
   }
}
if (strcmp(set, command))

应该是

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

原因是 strcmp returns 如果 LHS 或 RHS 较大则为非零值,如果它们相等则为零。由于零在条件条件下计算为 "false",因此您必须显式添加 == 0 测试以使其在您期望的意义上为真,即相等。

首先,在使用 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() return匹配0,如果不匹配,它return是一个非零值。

因此,

  • 如果您的输入 匹配 预期的预选字符串,您将得到 0 - 将被评估为 falsy 出乎你的意料,它将转到 else 部分。
  • 如果您的输入 与预期的预选字符串不匹配 ,您将得到一个非零值,该值将被评估为真实值,并且 if块将被错误地执行。

因此,在您的情况下,您需要更改条件以否定 return 值,例如

   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");
   }