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 ++中有一种不同的,更强大的字符串类型,所以在那种语言中会有所不同。