将一个char与const char *进行比较

8
string line = "blerdy blah";
for (int i = 0; i < string.size(); i++)
{

    line[i] != "n";
}

我遇到了错误“无法将char转换为const char *”。

如果我用以下代码替换最后一行:

line[i] != *"n";

它可以工作。从某种意义上说,我知道它是解除指针引用,但我不明白的是,为什么它一开始就是一个指针。这样写的任何字符都像是指向某个地方的一个单独的字符的指针吗?例如程序在某处有一整套符号,而这正是我指向的东西吗?

如果是这种情况,那我可以做一些愚蠢的事情,比如让'n'指针指向其他东西吗?

6个回答

13

在这种情况下,你必须比较 charchar

line[i] != 'n';

当你说*"n"时,实际上你是用n\0元素解引用了字符数组的第一个元素,这给了你n,这就是为什么它能工作,但你不想像那样写。

10

"n" 不是一个字符字面值,它是一个字符串字面值。你需要使用 'n'


+1 我认为指出 "" 是一个字符串字面值可以使这个答案更有价值。 - dk123

2
"

“n”是一个字符数组(字符串)。而‘n’是一个字符。

"

2

"n"是所谓的字符串字面量,它的类型为const char[2]string::operator[](实际上是basic_string<char>::operator[])返回一个const char&char&,具体取决于选择的重载(在这种情况下是第二个)。您不能比较这些类型。您想要比较operator[]的结果是一个字符字面量,写作'n'

对于您的第二个问题

"n"的类型为const char[2],对其进行解引用会给出一个char(指向数组中的第一个字符)。这等同于"n"[0]


1
挑剔一下: "n" 的类型是 const char[2],而不是 const char* - Benjamin Lindley
@BenjaminLindley 谢谢。我总是搞砸这个。 - pmr
这是否意味着如果我像这样初始化一个空字符串:string foo = ""; 是错误的?有更好的方法吗?我可以只写 string foo; 吗? - Dollarslice
2
@先生:不,那并没有错。它调用了一个接受const char *参数的字符串构造函数。但是,如果你想要一个空字符串,可以直接创建一个没有参数的字符串。 - Benjamin Lindley

1

"n"更改为'n'。区别在于前者是const char*,而后者是char。由于您想将一个char与另一个char进行比较,因此后者是正确的形式。


0

为什么以及如何工作

"n"开始:在词法上,它是一个以空字符结尾的字符串字面量,这意味着编译器最终会将其视为指向保存字符串“n”的内存部分的char*

因此,当您写*"n"时,发生的情况是您正在取消引用指向"n"char*,这意味着表达式的结果将是'n'(类型为char)。这就是为什么与line[i](也是char)的比较有效的原因。

这个指向"n"的指针是一个编译时常量(因此您无法更改它),很可能会指向一个只读内存页(因此您也无法在运行时更改它所指向的内容)。

你应该做什么

line[i] != 'n'; // compare char to char

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