cout 返回两次字符字符串

时间:2021-02-17 20:09:56

标签: c++ g++

下面代码的输出是

Toto
TotoToto

但我希望只是

Toto
Toto

为什么第二个 cout 重复输出中的字符串?

我在 Ubuntu 上使用 g++ 7.5.0 版,我不确定这是否相关。

代码如下:

#include<iostream>

using namespace std;

int main(){

  char c1[] = "Toto";
  char c2[4] = {'T','o','t','o'};


  cout << c1 << endl;
  cout << c2 << endl;


  return 0;

}

1 个答案:

答案 0 :(得分:5)

当你输出一个字符数组时,它必须——按照惯例——以空值结尾,否则你有未定义的行为

c2 更改如下,它将开始按预期工作:

char c2[5] = {'T','o','t','o', '\0'};

c1 的情况下,它假定您需要附加一个隐式空值并自动调整 c1 的大小以留出空间,因此如果您使用 sizeof 或 {{3 }} 要获得 c1 的大小,您会看到它是 5 个字节。

Drew 的评论建议解释调用函数时数组到指针的衰减,所以这里是。当你写:

cout << c2;

编译器调用函数std::ostream& operator<<(std::ostream&, const char*)。数组 c2 decayschar*,允许匹配和调用函数,但这样做会丢失所有关于文本长度的知识。函数实现要求您遵循在要流式传输的文本之后使用空终止符的约定。如果你想明确控制应该打印多少个字符,你可以使用例如std::cout.write(c2, 3)std::string 的工作也更直观 - 初学者应该更喜欢使用 std::string 来存储和操作文本。