【问题标题】:How to compare more than 2 strings in C?如何在C中比较两个以上的字符串?
【发布时间】:2014-03-23 15:58:21
【问题描述】:

我知道有 strcmp 但它只是让我比较两个字符串,而且我需要比较很多

这个不行:

if(strcmp (resposta, "S" || "s" || "N" || "n")== 0)
        printf("Resposta = S");
    else
        printf("Resposta != S");

    printf("\nfim");

【问题讨论】:

  • 你应该写if(strcmp(resposta, "S") == 0 || strcmp(resposta, "s") == 0 || ...)
  • 建议strcmp(str, "char1") || strcmp(str, "char2")... 的答案将不起作用,因为它们将始终评估为非空(字符串不相等)。
  • 对于这样的情况,只需使用一个集合(基于散列的可能是最好的)并测试resposta 是否在一个集合中。 Set 不是 C 的一个特性,所以你需要自己滚动或使用一些现有的库,或者切换到具有标准集的语言。
  • 我想我会用另一种语言来做这个程序:/
  • 如果您没有使用 C 的外部原因(例如,小型嵌入式系统、现有代码库、编写与语言无关的共享库、学习 C...),那么几乎任何其他现代语言将使生活更轻松,例如通过提供像 set 这样的标准容器。但是,如果您想使用 C,为此使用一个小的额外库应该不是一个大障碍 :-)

标签: c string strcmp


【解决方案1】:

您的方法未按预期工作,因为表达式 "S" || "s" || "N" || "n""S" 相同,因为短路。

你要和候选字符串一一比较:

if ((strcmp(resposta, "S") == 0
    || (strcmp(resposta, "s") == 0
    || (strcmp(resposta, "N") == 0
    || (strcmp(resposta, "n") == 0)
{
    printf("Resposta = S");
}

【讨论】:

  • @EOF:(strcmp("S", "S") == 0) 为“真”,计算结果为 1。 (man7.org/linux/man-pages/man3/strcmp.3.html)
  • @EOF 是的,每次通话后你看到== 0了吗?
  • 是的,所以如果resposta 不属于"S""s""N""n",则此答案的比较为“假”,计算结果为0
  • 我数了四个( 字符比) 字符。多么奇怪。
【解决方案2】:
if( strcmp (resposta, "S") == 0 || strcmp (resposta,"s") == 0  || strcmp (resposta,"N") == 0 || strcmp (resposta, "n") == 0)

【讨论】:

    【解决方案3】:

    标准库函数strcmp的签名是-

    int strcmp(const char *s1, const char *s2);
    

    但是,您将其称为

    strcmp(resposta, "S" || "s" || "N" || "n")
    

    第二个参数的计算结果为 1,它的类型为 int,因为字符串文字计算为指向其第一个字符的指针,它不能是 NULL。这显然是错误的。 您应该将其替换为

    if(!((strcmp(resposta, "S") && strcmp(resposta, "N") && strcmp(resposta, "n")))
        printf("Resposta = S");
    else
        printf("Resposta != S");
    

    【讨论】:

      【解决方案4】:

      如果您有很多要比较的字符串,您可以用它们创建一个数组并对其进行迭代。在此示例中,数组以 NULL 终止(因此 while 条件有效):

      const char *strings[] = { "S", "Sim", "N", "NAO", NULL };
                                                    // ^ add more strings here
      const char **s = strings;
      while (*s) {
          if (strcmp(resposta, *s) == 0) {
              (void) printf("Matched: %s\n", *s);
              break; // stop searching when a match is found (the matching string is *s)
          }
          ++s;
      }
      if (!*s) {
          (void) printf("Didn't match anything\n");
      }
      

      如果您有很多要匹配的字符串,更好的方法是对字符串数组进行排序并在其中进行二进制搜索。

      【讨论】:

        【解决方案5】:

        如果您要查找的字符串只有一个 char,则可以使用 switch 语句。

        switch(*string) //will compare the first character of your string
        {
            case('s'):
            {
                //whatever you do
                break;
            }
            case('S'):
            {
                //whatever else
                break;
            }
            ... //other characters
            default:
            {
                //error handling on incorrect input
                break;
            }
        }
        

        编辑:如果您正在比较不同长度的字符串(即您正在寻找字符串中的前缀),请注意strcmp()从不将它们视为相等。

        如果需要查找前缀,则需要strncmp()(注意n)与每个字符串和字符串长度分开。

        【讨论】:

        • 哦,在我的情况下看起来比使用 strcmp 更好
        • @Daniel:我是否也对strstr() 感兴趣?我听说这也很受欢迎(但可能不是最适合这里)
        • 我对 strstr() 一无所知,我随时准备学习新事物:D
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多