【问题标题】:character printing confusion字符打印混乱
【发布时间】:2015-07-26 19:36:02
【问题描述】:

我有一些代码:

#include <iostream>
#include <string>
using namespace std;
int main(){
    char abc [20] = "Hello Hello Hi";
    char* ptr = abc;
    cout << (abc+3);
return 0;

}

为什么它从第三个字符开始打印,而不是简单的第三个字符?

-edit- 给标记它的人。它与 prinf() 不同,而是相同类型的概念。我只是不知道细微差别

【问题讨论】:

  • cout &lt;&lt; abc; 也不会仅打印第一个(第 0 个)字符,而是整个字符串...跳过 3 个字节不会改变这种行为。
  • 为什么有char* ptr = abc

标签: c++ character sequences


【解决方案1】:

char abc [20] 衰减为char*,这实际上是一个 c 风格的字符串。 abc+3 仍然是一个指针,只是从 abc[0] 偏移,所以 std::cout 仍会将其打印为字符串。

【讨论】:

    【解决方案2】:

    要了解原因,您必须了解一点指针算法。

    abc 与 &abc[0] 相同,(abc + 3) 与 &abc[3] 相同

    话虽如此,cout 将字符串从给定的 char * 打印到空字符。

    因此,您基本上只是打印从第三个字符开始到字符串末尾的字符串。如果您只想打印第三个字符,您可以像这样取消引用指向第三个字符的指针。

     *(abc + 3)
    

    【讨论】:

    • 感谢@andrew-malta,这是有道理的。我唯一不知道的是它总是将字符串从给定的 char * 打印到 nul char
    【解决方案3】:

    因为流具有char* 的重载,它将输入视为 C 字符串。流运算符将打印所有内容,直到出现空终止符(当出现 char* 时)。

    如果要打印单个字符,则必须将表达式转换为 char 而不是 char*

    cout << (abc+3);     // Type of expression is char*
    
    cout << (*(abc+3));  // Type of expression is char
                         // This prints a signle character.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-25
      • 2023-03-14
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 2018-03-15
      相关资源
      最近更新 更多