检查输入是否与C中的单词匹配

时间:2016-11-28 20:33:11

标签: c string input scanf strcmp

我正在构建一个程序,它需要以'命令12'等命令的形式读取用户的输入,其中命令是特定的单词,需要存储在单独的变量中,数字也需要在它的变量之后

我创建了变量,其中需要匹配命令的字和用于存储的int变量。

char rule[5] = {'r', 'u', 'l', 'e', '\0'};
char command[6];
int cmd_num;

然后使用scanf读取它,然后通过strcmp进行比较。

scanf("%s %d", &command, &cmd_num);
if ( (strcmp(command, rule)) != 0)
{
  printf("Error.\n");
  return 1;
}

然而它并没有像我期望的那样起作用。我用谷歌搜索了几个小时,但我无法找到如何正确存储此字符串和数字后。谁能帮助我理解字符串是如何存储的?这将有助于我理解为什么strcmp不能像我期望的那样工作。

或者有没有更好的方法来检查用户输入是否匹配某个单词?之后的数字对我来说似乎有问题。我尝试使用获取功能,但我无法得到结果。提前谢谢。

1 个答案:

答案 0 :(得分:2)

首先,您可以使用双引号将rule直接定义为字符串(并避免写入它,使其成为常量指针):

const char *rule = "rule";
char command[6];
int cmd_num;

使用scanf时,限制读取长度以避免缓冲区溢出(使用%5s这是数组的最大大小减去零终结符),并且不传递数组的地址/指针,因为scanf已经可以访问要写入的字符串的地址:

nb_items = scanf("%5s %d", command, &cmd_num);

请注意,您可以知道已扫描的项目数(声明int nb_items;)。例如,如果用户忘记输入数字或输入非数字,您将获得nb_items==1,并且您将知道cmd_num尚未初始化。

这里的主要问题是您有未定义的行为,试图将scanf的结果存储在数组地址的地址中。