cout return 两次一串char
cout return twice a string of char
下面代码的输出是
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;
}
当你流出一个字符数组时,它必须——按照惯例——以空值终止,否则你有未定义的行为。
按如下方式更改 c2
,它将按预期开始工作:
char c2[5] = {'T','o','t','o', '[=10=]'};
在 c1
的情况下,它假定您需要附加一个隐式 null 并且大小 c1
自动允许 space,因此如果您使用 sizeof
or std::extent<>
得到 c1
的大小,你会看到它是 5 个字节。
Drew 的评论建议在调用函数时解释数组到指针的衰减,所以这里开始。当你写:
cout << c2;
编译器调用函数std::ostream& operator<<(std::ostream&, const char*)
。数组 c2
衰减 为 char*
,允许匹配和调用函数,但这样做会丢失所有关于文本长度的知识。函数实现希望您遵循在要流式传输的文本之后使用空终止符的约定。如果你想明确控制应该打印多少个字符,你可以使用例如std::cout.write(c2, 3)
。 std::string
s 也更直观地工作 - 初级程序员应该更喜欢使用 std::string
s 来存储和操作文本。
下面代码的输出是
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;
}
当你流出一个字符数组时,它必须——按照惯例——以空值终止,否则你有未定义的行为。
按如下方式更改 c2
,它将按预期开始工作:
char c2[5] = {'T','o','t','o', '[=10=]'};
在 c1
的情况下,它假定您需要附加一个隐式 null 并且大小 c1
自动允许 space,因此如果您使用 sizeof
or std::extent<>
得到 c1
的大小,你会看到它是 5 个字节。
Drew 的评论建议在调用函数时解释数组到指针的衰减,所以这里开始。当你写:
cout << c2;
编译器调用函数std::ostream& operator<<(std::ostream&, const char*)
。数组 c2
衰减 为 char*
,允许匹配和调用函数,但这样做会丢失所有关于文本长度的知识。函数实现希望您遵循在要流式传输的文本之后使用空终止符的约定。如果你想明确控制应该打印多少个字符,你可以使用例如std::cout.write(c2, 3)
。 std::string
s 也更直观地工作 - 初级程序员应该更喜欢使用 std::string
s 来存储和操作文本。