【问题标题】:C - Comparing string literal with character arrayC - 将字符串文字与字符数组进行比较
【发布时间】:2013-08-04 06:54:37
【问题描述】:

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

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

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

当然,之后我想弄清楚他们输入了什么命令(类似于:“if (command == "hello"),然后做某事”)。我知道这在 C 中是不可能的,因为我将字符串文字与字符数组进行比较,但有什么好的方法呢?我尝试过使用strcmp(command, "hello"),但仍然出现错误。

您能提供的任何建议将不胜感激。谢谢!

【问题讨论】:

  • 究竟是什么“错误”? strcmp() 是要走的路。
  • 另外,我在您的代码中看到的最严重的错误是使用了scanf()。完全忘记这个功能。您正在寻找 fgets(command, sizeof command, stdin)
  • (不使用scanf的主要原因;它可以扫描的数量没有限制。如果用户输入21个字符怎么办?)
  • 此外,顺便说一下,字符串文字本身就是一个字符数组。

标签: c arrays string character strcmp


【解决方案1】:

我已经写了我认为你正在尝试做的完整版本:

    #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 的建议,非常感谢大家的详尽回答!你太有帮助了!
  • 您介意点赞有用的答案并选择一个作为正确答案吗?
  • RSinghS - 我已经尝试过,但我需要有 15 个声望才能对答案进行投票。一旦有能力,我一定会投票赞成有用的答案! :)
  • @Irina,我认为如果这是您的问题,您可以从您的角度选择“正确”的答案!这与投票不同,但它确实提供了有用的反馈。
  • 了解并完成。谢谢和抱歉!这里还是新的。 :)
【解决方案2】:

当字符串相同时,strcmp 返回 0。我有使用 strcmp 将字符数组与字符串文字进行比较的代码,当它不起作用时我很困惑。事实证明,当字符串相同时,我假设它会返回 1 是错误的!

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

【讨论】:

  • 确实,做假设是编写程序的错误方式——应该阅读文档。
【解决方案3】:

我认为这对你来说是一个完美的起点:

http://www.wikihow.com/Compare-Two-Strings-in-C-Programming

它可能以适合您的水平编写。祝你好运,欢迎使用 *!

【讨论】:

    【解决方案4】:

    在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 相同的位置。

    【讨论】:

      最近更新 更多