【问题标题】:comparing a char to a const char * [duplicate]比较 char 和 const char * [重复]
【发布时间】:2011-10-18 13:58:34
【问题描述】:
string line = "blerdy blah";
for (int i = 0; i < string.size(); i++)
{

    line[i] != "n";
}

这样我得到错误“无法从 char 转换为 const char *”

如果我将最后一行替换为

line[i] != *"n";

它有效。我明白为什么在某种意义上,我要取消引用一个指针。我不明白为什么它首先是一个指针。像这样写的任何字符实际上是指向某个地方的一个字符的指针吗?就像程序在某处有一组每个符号,这就是我所指的?

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

【问题讨论】:

    标签: c++


    【解决方案1】:

    在这种情况下,您必须将 charchar 进行比较:

    line[i] != 'n';
    

    当您说 *"n" 时,实际上是取消引用 char 数组的第一个元素,其中包含 n\0 元素,这给了您 n,这就是它起作用的原因,但您不想这样做就这样写吧。

    【讨论】:

      【解决方案2】:

      "n" 不是字符文字,它是字符串文字。你想要'n'

      【讨论】:

      • +1 我认为说明 "" 是一个字符串文字给了这个答案最大的价值。
      【解决方案3】:

      "n" 是一个字符数组(字符串)。而 'n' 是一个字符。

      【讨论】:

        【解决方案4】:

        "n" 是一个所谓的字符串字面量,其类型为const char[2]string::operator[] (实际上 basic_string&lt;char&gt;::operator[] 返回 const char&amp;char&amp; 取决于选择的重载(本例中为第二个)。您无法比较这些类型。您想要将 operator[] 的结果与是一个字符文字,写作'n'

        第二个问题

        "n" 具有const char[2] 类型,取消引用它会给你一个char(数组中指向的第一个字符)。这相当于"n"[0]

        【讨论】:

        • Nitpick:“n”的类型为const char[2],而不是const char*
        • @BenjaminLindley 谢谢。我总是把事情搞砸。
        • 这是否意味着如果我像这样初始化并清空字符串:string foo = "";这是错的?有没有更好的办法?我可以只做 string foo; ?
        • @Sir:不,这没有错。它调用带有 const char * 的字符串构造函数。但是,是的,如果您想要一个空字符串,您可以简单地创建不带参数的字符串。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          为什么以及如何工作

          "n" 开头:从词法上讲,它是一个以null 结尾的字符串文字,这意味着编译器最终会将其视为一个char*,指向包含字符串“n”的内存部分。

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

          这个指向"n" 的指针是一个编译时常量(所以你不能改变它)并且很可能会指向一个只读内存页(所以你不能改变它所指向的内容)在运行时)。

          你应该怎么做

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

          【讨论】:

            猜你喜欢
            • 2013-11-27
            • 2011-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多