在 c++ 中对字符串使用复制函数时打印的垃圾值

Garbage value getting printed when using copy function for a string in c++

本文关键字:打印 函数 复制 c++ 字符串      更新时间:2023-10-16

我只是在 c++ 中使用复制函数将字符串复制到数组中。但以下代码显示的结果包含垃圾值:

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
char t[10];
s = "Hello";
s.copy(t, s.length());
cout << t;
return 0;
}

输出:Hellov._Sï

然而,如果我以不同的方式做同样的事情。我得到了正确的输出。

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "Hello";
char t[10];
s.copy(t, s.length());
cout << t;
return 0;
}

输出:你好

有人可以解释为什么会发生这种情况吗?我对 c++ 比较陌生。

问题是std::string::length()不包括字符串的 NUL 终止符。所以s.copy(t, s.length());'H', 'e', 'l', 'l', 'o'复制到t,但不是后面的''。该数组的以下元素未清零(它们可能偶然包含一些零(。

但是std::cout,当传递一个char*时,期望一个以 nul 结尾的字符串。它将继续打印,直到找到 0 字节或发生其他情况(溢出t是未定义的行为(。

您可以通过终止 nult来"修复"它:

t[s.length()] = '';