c如何将字符变量与字符串进行比较?

Far*_*hid 2 c string char

以下代码在C中完全没问题,但在C++中没有.在下面的代码if语句中始终为false.C如何将字符变量与字符串进行比较

int main()
{
  char ch='a';
  if(ch=="a")
    printf("confusion");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 5

以下代码在C中完全没问题

一点都不.

在你的代码中

  if(ch=="a")
Run Code Online (Sandbox Code Playgroud)

本质上是试图比较ch字符串文字的基地址的值"a",.这意味着使用更少.

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

  if(ch == 'a')
Run Code Online (Sandbox Code Playgroud)

注1:

详细说明char文字的单引号和字符串文字的双引号之间的区别,

对于char文字C11,章节§6.4.4.4

整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如 'x'

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

字符串字符串是用双引号括起来的零个或多个多字节字符的序列,如"xyz".


笔记2:

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


Ste*_*mit 5

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

'a'是单个字符。它实际上是一个小整数,其值是机器字符集中给定字符的值(几乎总是 ASCII)。因此,'a'具有值97,你可以通过运行看

char c = 'a';
printf("%d\n", c);
Run Code Online (Sandbox Code Playgroud)

"a",另一方面,是一个字符串。它是一个字符数组,以空字符结尾。在 C 中,数组几乎总是通过指向它们的第一个元素的指针来引用,因此在这种情况下,字符串常量"a"就像一个指向两个字符数组的指针,'a'而终止的'\0'. 你可以通过运行看到

char *str = "a";
printf("%d %d\n", str[0], str[1]);
Run Code Online (Sandbox Code Playgroud)

这将打印

97 0
Run Code Online (Sandbox Code Playgroud)

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

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

if(c == str[0])
     printf("they are equal\n");
else printf("confusion\n");
Run Code Online (Sandbox Code Playgroud)

或者您可以从字符构造一个字符串,然后进行比较。在 C 中,这可能如下所示:

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

if(strcmp(tmpstr, str) == 0)
     printf("they are equal\n");
else printf("confusion\n");
Run Code Online (Sandbox Code Playgroud)

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