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

标签 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 不能按我期望的方式工作。

或者有没有更好的方法来检查用户输入是否与某个单词匹配?后面的数字对我来说似乎有问题。我尝试使用获取函数,但无法得出结果。预先感谢您。

最佳答案

首先,您可以使用双引号直接将 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 的结果存储在数组地址的地址中时存在未定义的行为。

关于检查输入是否与 C 中的单词匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40852934/

相关文章:

c - C 中的后增量和前增量

python - 在 Python 中随机化字符串列表的最佳方法

java - 字符串与文字 java == interned 字符串比较

Main 中的 Java 构造函数用户输入在构造函数中以 Null 结尾

c - 展开一个非指针数组

c - F77 中的不透明指针

c - Dev C++ 数组问题

python - 如何删除以某物开头和结尾的子字符串?

c - scanf() 没有为输入的 double 提供正确的值

c - C 中 getChar 循环的字符数限制