C语言中,如何将字符变量与字符串进行比较?

3
以下代码在 C 中完全可行,但在 C++ 中不行。在下面的代码中,if 语句总是 false。C 是如何将字符变量与字符串比较的呢?
int main()
{
  char ch='a';
  if(ch=="a")
    printf("confusion");
  return 0;
}

3
启用编译器警告。 - too honest for this site
3个回答

8

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

不,完全不是这样。

在你的代码中

  if(ch=="a")

这里实际上是在尝试将ch的值与字符串字面量"a"的基地址进行比较,这是没有意义和用处的。

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

  if(ch == 'a')

注意1:

为了说明单引号用于char字面值,双引号用于字符串字面值的区别,

对于char字面值,参见C11章节§6.4.4.4:

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

对于字符串字面值,参见章节§6.4.5:

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


注意2:

话虽如此,需要注意的是,main()函数的推荐签名是int main(void)


5
我不会说这段代码在任何一种语言中都是好的。 '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++中有一种不同、更强大的字符串类型,因此在那种语言中情况会有所不同。


3

'a'(一个字符)和"a"(包含两个字符a\0的字符串)之间有差别。当执行ch=="a"比较时,该表达式将把"a"转换为指向其第一个元素的指针,因此该地址不是一个字符,而是一个十六进制数,结果将评估为false

修改为:

 if(ch=='a')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接