【问题标题】:why string prints junk value,if we give it size?为什么字符串打印垃圾值,如果我们给它大小?
【发布时间】:2021-12-22 01:34:09
【问题描述】:
#include <iostream>

using namespace std;

int main()
{
    string a("Hello World",20);
    cout<<a<<endl;
  
    return 0;
}

我得到的输出是“Hello WorldP”。为什么? 通常我们只用数据初始化字符串。但这里我给出了大小。但这需要瘾​​君子。 所以我不想给出尺寸吗?

【问题讨论】:

  • 因为你告诉你的字符串,传递的 (C-)String 是 20 个字符长,即使它不是。因此,它会在内存中获取“终止 0 之后的任何内容”并将其附加到字符串中。 &lt;&lt; 最终采用“整个字符串”,而不仅仅是“直到第一个 \0 的字符串”。
  • 你为什么把,20 放到string a("Hello World",20); 中?你想达到什么目的?
  • 缓冲区溢出演示:godbolt.org/z/6Y4fYMq1q 使用地址清理器

标签: c++ string


【解决方案1】:

这通常称为garbage in, garbage out

来自cppreference

用s指向的字符串的前count个字符构造字符串。 s 可以包含空字符。字符串的长度是计数。如果 [s, s + count) 不是有效范围,则行为未定义。

你的程序的行为是未定义的,因为"Hello World" 是一个const char[12] 并且试图通过const char* 访问直到索引20 的字符(由于数组衰减到指向它的第一个元素的指针)出来了的界限。


该构造函数的实际用例是从某个 C 字符串的子字符串创建 std::string,例如:

std::string s("Hello World",5);  // s == "Hello"

或者从中间包含\0的C字符串创建std::string,例如:

std::string s("\0 Hello",5); // s.size() == 5 (not 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多