【问题标题】:Can I use strcmp as a boolean?我可以使用 strcmp 作为布尔值吗?
【发布时间】:2016-04-07 07:50:31
【问题描述】:

我正在尝试使用 fgets 根据用户输入的字符串来调用不同的函数。我知道我稍后需要使用 strtok,因为会有空格,例如“load 12”。但是现在,我对使用 strcmp 比较输入的字符串感到困惑。我知道 strcmp 可以这样使用:

int check;
char string[10] = "test";

check = strcmp(string, "test");
// Check will be 0 if true

if (check == 0)
{
    printf("same string\n");
}
else
{
    printf("not the same\n");
}

可以是真假之类的布尔值吗?如果“test”实际上是“test”,布尔值变为真,那么我将在if语句中使用布尔值。

【问题讨论】:

  • 您没有将其用作布尔值。 check 是一个整数,并将其与另一个整数进行比较。
  • 是的,你可以,但是如果字符串 不同,布尔上下文中的 strcmp 返回值将是 true(非零值),如果不是,则返回 false。 .. 这就是为什么我更喜欢比较 `== 0`。
  • 如果要针对布尔值truefalse进行测试,不仅逻辑会被反转,而且函数不一定返回1,只有一个正值,所以你不能使用if(strcmp(string, "test") == true)
  • C 中没有标准的布尔类型。ints 用作真值:0 代表假,每个非空数字都代表真。
  • @Morovaille 请see this question

标签: c strcmp


【解决方案1】:

您可以编写和使用包装器/帮助器函数来实现此目标,如下所示:

bool are_equal(char* a, char* b)
{
    return strcmp(a, b)==0;
}

【讨论】:

    【解决方案2】:

    if (strcmp(string, "test") == 0) 将检查两个字符串是否相同。

    strcmp(..)的返回值为整数,如果两个字符串相同,则返回值为整数0。如此有效地比较0 == 0,所以没关系。

    【讨论】:

      【解决方案3】:

      strcmp() 在字符串相等时返回整数值 0。对于布尔检查,c 中除整数 0 以外的所有内容都计为真,整数 0 计为假。

      所以是的,你的方法会奏效。

      【讨论】:

      • 这就是答案。
      【解决方案4】:

      strcmp 和其他此类函数的问题在于,它们可以追溯到 C 没有布尔类型的时代。因此,他们将“不等于”定义为大于或小于零的整数,具体取决于第一个字符串是大于还是小于第二个字符串。在strcmp 的实现中,您可能会发现类似

      int strcmp(const char *s1, const char *s2)
      {
        ...
        if(*s1 != *s2)
        {
          return *s1 - s2*
        }
        ...
        return 0;
      }
      

      意味着如果字符串不相等,该函数可能会返回任何数字,等于找到的第一个不相等字符的符号代码之间的差。

      您可以通过围绕strcmp 设计包装器来解决此问题:

      inline bool is_equal (const char* s1, const char* s2)
      {
        return strcmp(s1, s2) == 0;
      }
      
      inline bool is_greater (const char* s1, const char* s2)
      {
        return strcmp(s1, s2) > 0;
      }
      
      inline bool is_less (const char* s1, const char* s2)
      {
        return strcmp(s1, s2) < 0;
      }
      

      现在你可能会注意到 strcmp 的返回值的原始定义并不像看起来那么愚蠢,因为这意味着他们可以编写 1 个函数而不是 3 个。这在编写比较函数时非常方便对于bsearchqsort 等。

      【讨论】:

        【解决方案5】:

        您实际上可以将 strcmp 用作布尔值,因为您要检查的是字符串是否相同;所以这将返回一个 0 (这也意味着假)。所以你只需要写:

        if (!strcmp(string, "test")) //!0 = true
        {
            printf("same string\n");
        }
        else
        {
            printf("not the same\n");
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 2014-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多