我可以使用strcmp作为布尔值吗?

时间:2016-04-07 07:50:31

标签: c strcmp

我正在尝试使用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");
}

它可以是像true和false这样的布尔值吗?如果“test”实际上是“test”,布尔值变为true,那么我将在if语句中使用boolean值。

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

strcmp(..)的返回值是一个整数,如果两个字符串相同,则返回值为整数0。所以你有效地比较0 == 0是否正确。

答案 2 :(得分:1)

当字符串相等时,

strcmp()返回一个整数值0。对于布尔检查,除c中的整数0之外的所有内容都计为true,而整数0则为false。

是的,你的方法会奏效。

答案 3 :(得分:0)

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等的比较函数

答案 4 :(得分:0)

实际上,您可以将strcmp用作布尔值,因为您要检查的是字符串是否相同;请参见。因此将返回0(也表示false)。所以你只要写:

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