【问题标题】:Why can std::cout print a char[]? [duplicate]为什么 std::cout 可以打印一个 char[]? [复制]
【发布时间】:2014-10-14 13:02:36
【问题描述】:

下面的代码打印整个字符串。我很困惑为什么会这样。

char test[] = "jeff";
cout<<test<<endl;

输出是“Jeff”,我期待它打印 char 数组“test”的值,因为 test 是指针,指针第一个元素是 'J'。

当我 cout&lt;&lt;test?? 时,它为什么打印整个字符串?

【问题讨论】:

  • 如果 "cout
  • 查看reference
  • @DOUGLASO.MOEN:有一个循环。 for (auto p = test; *p; ++p) cout &lt;&lt; *p;
  • @BenjaminLindley 谢谢,但我问 OP 如果他的期望正确,他会怎么做?

标签: c++ pointers char


【解决方案1】:

在 C++ 中(如在 C 中),字符串被建模为以 NUL 结尾的字符数组,即最后一个字符的序数值为 0,在您的示例中,它是索引为 4 的字符,由编译器在最后一个“f”之后立即插入在“杰夫”中。因此,在许多情况下,指向“char”的指针被假定为 NUL 终止的;在这种情况下,“cout”会一直打印字符,直到最后碰到 NUL 字符,此时它停止。 C++ 还有一个实际的字符串类“std::string”,它在很多方面都优于 char 数组。

【讨论】:

  • +1 用于提及 std::string 类。如果您想与 C 库交互并需要 char*,只需调用 std::string.c_string() 实例方法即可。
【解决方案2】:

因为operator&lt;&lt; (basic_ostream&lt;charT,traits&gt;&amp; os, const char* s);(该列表中的#2“字符序列”)(slightly more technical list)。 test 衰减为指针,或 char*,然后打印为 C 字符串。

这与cout &lt;&lt; "Jeff"; 工作的原因完全相同(而不是打印"Jeff" 的地址)。

【讨论】:

    【解决方案3】:

    当然,第一个元素是'j',但char* 并不意味着只代表一个char,而是一个stringcout 将继续阅读 chars 直到找到空字符或 '\0'。当您使用诸如"jeff" 之类的字符串文字时,它会隐式地放在那里。

    要仅打印第一个 char,请取消引用指针以获取它,如 cout&lt;&lt;*test&lt;&lt;endl;

    【讨论】:

    • 从技术上讲,test 不是char*。它衰减char*。 (我知道你没有明确声明它是char*,但听起来你是在暗示它)
    • 谢谢我现在明白了。
    • @Cornstalks,你说它衰减为 char* 是什么意思。 “test”确实指向字符串的第一个字符,对吗?
    • @Cornstalks 你说得很好。我忽略了这个细节,因为在这个问题中,Harshanand 在这一点上似乎很可靠。
    • @HarshanandNyshadham:从技术上讲,test 是一个数组(正如 chris 所提到的)。它的类型是char [5]
    猜你喜欢
    • 1970-01-01
    • 2020-07-23
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 2020-05-01
    相关资源
    最近更新 更多