C - 将字符串字面量与字符数组进行比较

8

我是一名新手,对于如何通过字符数组使用字符串仍然有些困惑。

在我的C程序中,我正在接受用户的命令:

char command[20];
scanf("%s",command);

当然,之后我想找出他们输入的命令(类似于“if (command == "hello"),则执行某些操作”)。我知道这在C语言中是不可能的,因为我正在将字符串字面量与字符数组进行比较,但有什么好的方法吗?我已经尝试使用strcmp(command, "hello"),但仍然出现错误。如果您能提供任何建议,将不胜感激。谢谢!

3
具体指哪些“错误”?使用strcmp()是正确的方法。 - user529758
此外,我在你的代码中看到的最糟糕的错误就是使用了 scanf() 函数。完全忘记这个函数吧。你应该使用 fgets(command, sizeof command, stdin) - user529758
那也是。但让用户溢出您的缓冲区比搞砸正则表达式更可怕。 - Dennis Meng
@H2CO3:它并不是假装理解正则表达式,只是实现了一种比正则表达式弱的扫描语法。例如使用scanf("%20s", command);可以避免缓冲区溢出。但是使用fgets()后跟sscanf()更加健壮。 - Keith Thompson
@KeithThompson 我所指的只是 scanf() 格式字符串的语法对于刚开始学习编程的人来说非常容易误导。 - user529758
显示剩余3条评论
4个回答

15

我已经写了一个完整的版本,用来实现我认为你正在尝试做的事情:

    #include <string.h>
    void main()
    {

       char command[20];
       scanf("%s",command);

       // command and "hello" can be less than, equal or greater than!
       // thus, strcmp return 3 possible values
       if (strcmp(command, "hello") == 0)
       {
          printf("\nThe user said hello!");
       }

    }

有几个人评论说要使用scanf,他们是正确的,但是一个新手程序员必须从某个地方开始学习这些东西,所以不要感到太难过,我们都在学习中...

希望这可以帮助你。


是的,你们都是对的。问题在于我认为strcmp只是一个布尔函数,而实际上它返回3个可能的值。一旦我更熟悉fgets,我会尝试使用它。我使用scanf的原因是我需要读取用户输入的命令直到第一个空格(不是整行,因为我需要每行读取两个命令)。一旦我弄清楚如何用fgets控制我正在读取的内容,我肯定会使用它。感谢关于fgets的建议,非常感谢大家详细的回答!你们真的很有帮助! - Irina
你介意给有用的答案点赞并选择一个作为正确答案吗? - gravitas
RSinghS - 我已经尝试过了,但我需要拥有15个声望才能为答案投票。一旦我能够投票,我一定会投票给有用的答案! :) - Irina
@Irina,我认为如果这是你的问题,你可以从你的角度选择“正确”的答案!!这与点赞不同,但它确实提供了有用的反馈。 - JackCColeman
明白了,已完成。谢谢和抱歉!我还是新手。 :) - Irina

7

strcmp函数在字符串相等时返回0。我有一段代码,使用strcmp比较字符数组和字符串字面值,当它没有按照我预期工作时,我感到非常困惑。结果发现,我错误地假设当字符串相同时它会返回1!

也许你也犯了同样的错误?


2
事实上,做出假设是编写程序的错误方式 - 应该阅读文档。 - user529758

2

0

当谈到C语言中的字符串时,通常有两种形式:1.字符数组,2.字符指针。大多数情况下,它们是可以互换的。例如:

char *cmd_ptr = "command1";
char cmd_array[20] = "command2";
printf ("cmd1: %s cmd2: %s\n", cmd_ptr, cmd_array);

上述定义的主要区别在于,对于 cmd_ptr,您无法像 cmd_ptr[0] = 'a'; 那样更改其内容,而对于cmd_array,您可以更改数组中的任何元素。

但是,您可以执行 cmd_ptr = cmd_array;,然后通过 cmd_ptr 进行更改,因为它指向与 cmd_array 相同的位置。

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