c如何比较字符变量和字符串?

How does c compare character variable against string?

以下代码在C中完全可以,但在C++中则不行。在下面的代码中,if 语句始终为假。 C 如何比较字符变量和字符串?

int main()
{
  char ch='a';
  if(ch=="a")
    printf("confusion");
  return 0;
}

'a'(一个字符)和"a"(一个包含两个字符a[=14=]的字符串)是有区别的。 ch=="a" 比较将评估为 false 因为在此表达式中 "a" 将转换为指向其第一个元素的指针,当然该地址不是字符而是十六进制数。

改为

 if(ch=='a')

The following code is completely ok in C

不,一点也不。

在你的代码中

  if(ch=="a")

本质上是试图将 ch 的值与字符串文字 "a" 的基地址进行比较。这是无意义和无用的。

你在这里想要的是使用单引号 (') 来表示 char 文字,比如

  if(ch == 'a')

注 1:

详细说明char字面量的单引号和字符串字面量s的双引号的区别,

对于 char 文字,C11,章节 §6.4.4.4

An integer character constant is a sequence of one or more multibyte characters enclosed in single-quotes, as in 'x'

并且,对于 字符串文字 ,章节 §6.4.5

Acharacter string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in "xyz".


注2:

也就是说,作为注释,main() 的推荐签名是 int main(void)

我不会说代码在任何一种语言中都可以。

'a' 是单个字符。它实际上是一个小整数,其值是机器字符集中给定字符的值(几乎总是 ASCII)。所以 'a' 的值为 97,如 运行

所示
char c = 'a';
printf("%d\n", c);
另一方面,

"a" 是一个字符串。它是一个字符数组,以空字符结尾。在 C 中,数组几乎总是由指向其第一个元素的指针引用,因此在这种情况下,字符串常量 "a" 就像指向两个字符数组的指针,'a' 和终止 '[=20 =]'.你可以通过 运行

看到
char *str = "a";
printf("%d %d\n", str[0], str[1]);

这将打印

97 0

现在,我们不知道编译器会选择将我们的字符串放在内存中的什么位置,所以我们不知道指针的值是什么,但可以肯定地说它会 永远不会等于97。所以比较if(ch=="a")永远是假的。

当你需要比较一个字符和一个字符串时,你有两种选择。您可以将字符与字符串的第一个字符进行比较:

if(c == str[0])
     printf("they are equal\n");
else printf("confusion\n");

或者您可以从字符构造一个字符串,然后进行比较。在 C 中,它可能看起来像这样:

char tmpstr[2];
tmpstr[0] = c;
tmpstr[1] = '[=14=]';

if(strcmp(tmpstr, str) == 0)
     printf("they are equal\n");
else printf("confusion\n");

这就是 C 的答案。C++ 中有一个不同的、更强大的字符串类型,所以在该语言中情况会有所不同。