【问题标题】:Check if input matches word in C检查输入是否与C中的单词匹配
【发布时间】:2016-11-28 20:33:10
【问题描述】:

我正在构建一个程序,它需要以命令的形式从用户那里读取输入,例如“命令 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 不能按我预期的方式工作。

或者有没有更好的方法来检查用户输入是否匹配某个单词?后面的数字对我来说似乎是个问题。我试图玩弄获取函数,但我无法得出结果。提前谢谢你。

【问题讨论】:

    标签: c string input scanf strcmp


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 我尝试对 scanf (%5s) 使用限制,问题是,我有两个命令,我不知道用户会输入哪一个,我需要同时识别它们,不幸的是,它们的长度不同
    • 那么你的command 缓冲区太小了。将其增加到最大命令长度。不检查缓冲区可能会使您的程序崩溃。 5 是最大限制。您不必输入 5 个字符。
    • 我试过了,但是 strcmp 不起作用,难道是因为字符串不相等吗?假设我的输入是 'raven 12' 并且我有 const char *raven = "raven";当我在这两个上使用 strcmp 时,它不起作用,即使当我打印它们时,它们也会打印相同的字符串。
    • 天哪,我的 if 语句是错误的,您的回答非常有帮助,非常感谢!
    猜你喜欢
    • 2021-08-18
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    相关资源
    最近更新 更多