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++ 中有一个不同的、更强大的字符串类型,所以在该语言中情况会有所不同。
以下代码在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++ 中有一个不同的、更强大的字符串类型,所以在该语言中情况会有所不同。