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

3
我有以下代码,它应该获取用户输入的命令,然后检查命令是否预定义。但是,无论输入什么命令,输出都是“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");
   }
}
2个回答

8
if (strcmp(set, command))

应该是

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

原因是 strcmp 如果左操作数或右操作数较大则返回非零值,如果它们相等则返回零。由于零在条件语句中被视为“假”,因此您需要显式添加 == 0 测试以使其在您期望的意义上为真,即相等。

2

首先,使用 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部分。
  • 如果您的输入不匹配所期望的预选字符串,则会得到一个非零值,该值将被评估为truthy,并且再次错误地执行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");
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接