以下代码在C中完全没问题,但在C ++中没有。在以下代码中if
语句始终为false。 C如何将字符变量与字符串进行比较?
int main()
{
char ch='a';
if(ch=="a")
printf("confusion");
return 0;
}
答案 0 :(得分:5)
以下代码在C
中完全没问题
不,完全没有。
在您的代码中
if(ch=="a")
本质上是尝试将ch
的值与字符串文字"a"
的基址进行比较。这是意义和使用更少。
您想要的是使用单引号('
)来表示char
字面值,例如
if(ch == 'a')
注1:
详细说明char
文字的单引号与字符串文字的双引号之间的区别
对于char
文字,C11
,章节§6.4.4.4
整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如
'x'
和 string literal ,章节§6.4.5
Acharacter string literal是一个包含零个或多个多字节字符的序列 双引号,如
"xyz"
。
注2:
即说明,main()
的推荐签名为int main(void)
。
答案 1 :(得分:3)
我不会说这两种语言的代码都没问题。
'a'
是一个单一字符。它实际上是一个小整数,其值为机器字符集中给定字符的值(几乎总是ASCII)。所以'a'
的值为97,正如您可以通过运行
char c = 'a';
printf("%d\n", c);
另一方面, "a"
是一个字符串。它是一个以null字符结尾的字符数组。在C中,数组几乎总是通过指向它们的第一个元素的引用来引用,所以在这种情况下,字符串常量"a"
就像一个指向两个字符'a'
和终止{{1}的数组的指针}}。你可以通过运行
'\0'
这将打印
char *str = "a";
printf("%d %d\n", str[0], str[1]);
现在,我们不知道编译器会选择放置字符串的内存在哪里,所以我们不知道指针的值是什么,但可以说是安全的永远不会等于97.所以比较97 0
将始终为假。
当您需要比较一个字符和一个字符串时,您有两个选择。您可以将字符与字符串的第一个字符进行比较:
if(ch=="a")
或者你可以从角色构造一个字符串,并进行比较。在C中,可能如下所示:
if(c == str[0])
printf("they are equal\n");
else printf("confusion\n");
这是C的答案.C ++中有一个不同的,更强大的字符串类型,所以这种语言会有所不同。
答案 2 :(得分:2)
'a'
(字符)和"a"
(包含两个字符a
和\0
的字符串)之间存在差异。 ch=="a"
比较将被评估为false
,因为在此表达式"a"
将转换为指向其第一个元素的指针,当然该地址不是字符而是十六进制数。
将其更改为
if(ch=='a')