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

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

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

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

一点都不。

在你的代码中

  if(ch=="a") 

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

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

  if(ch == 'a') 

注1:

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

对于char literal, C11 ,章节§6.4.4.4

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

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

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


笔记2:

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

'a' (字符)和"a" (具有两个字符a\0的字符串)之间存在差异。 ch=="a"比较将被评估为false因为在此表达式中, "a"将转换为指向其第一个元素的指针,当然该地址不是字符而是hex数。

将其更改为

  if(ch=='a') 

我不会说这两种语言的代码都没问题。

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

 char c = 'a'; printf("%d\n", c); 

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

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

这将打印出来

 97 0 

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

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

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

或者你可以从角色构造一个字符串,并进行比较。 在C中,可能如下所示:

 char tmpstr[2]; tmpstr[0] = c; tmpstr[1] = '\0'; if(strcmp(tmpstr, str) == 0) printf("they are equal\n"); else printf("confusion\n"); 

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