C++中使用带大小参数的std::string构造函数为何输出垃圾值?是否应避免指定该参数?
关于std::string构造时指定大小出现垃圾值的问题
让我帮你拆解清楚这个问题的来龙去脉:
首先,你调用的是std::string的这个重载构造函数:string(const char* s, size_t count)。它的设计逻辑是从传入的C风格字符串s的起始位置,读取count个字符来初始化string对象——重点是,这个构造函数完全不会识别C风格字符串末尾的'\0'终止符,也不会检查s本身的实际长度是否足够。
回到你的代码:string a("Hello World",20);,"Hello World"本身只有11个可见字符(算上末尾的'\0'是12字节),但你要求构造函数读取20个字符。当它读完"Hello World"的所有字符后,会继续从内存中该字符串后续的区域读取剩余9个随机值(也就是你看到的P这类垃圾字符),直到凑够20个字符,这就是输出出现异常内容的原因。
那是不是要彻底避免在std::string构造时指定大小参数?当然不是——关键是要匹配正确的构造函数重载:
- 如果你想创建一个包含N个重复字符的字符串,用
string(size_t n, char c),比如string(20, 'x')会生成20个x的字符串。 - 如果你只是想从C风格字符串初始化,直接用
string("Hello World")即可,它会自动识别'\0',只读取有效字符。 - 如果你确实需要从C风格字符串截取前N个字符,必须确保N不超过该字符串的实际有效长度(或者你明确知道后续内存区域的内容是安全可用的),比如
string("Hello World",5)会正确生成"Hello"。
给你个修正后的例子,如果你想生成20个字符长度的字符串,把"Hello World"补全到指定长度:
#include <iostream> #include <string> using namespace std; int main() { string a("Hello World"); a.resize(20, ' '); // 调整到20个字符,不足部分用空格填充 cout << a << endl; return 0; }
内容的提问来源于stack exchange,提问作者Nidhin Tomy
相关产品推荐
相关产品推荐

