gpt4 book ai didi

c++ - std::string的大小是否总是打印字符的数量?

转载 作者:行者123 更新时间:2023-12-03 07:08:39 29 4
gpt4 key购买 nike

我试图了解std::string::size()返回什么。
根据https://en.cppreference.com/w/cpp/string/basic_string/size的说法,它是“字符串中CharT元素的数量”,但是我不确定这与打印字符的数量有何关系,尤其是在涉及字符串终止字符的情况下。
这段代码

int main()
{
std::string str0 = "foo" "\0" "bar";
cout << str0 << endl;
cout << str0.size() << endl;

std::string str1 = "foo0bar";
str1[3] = '\0';
cout << str1 << endl;
cout << str1.size() << endl;
return 0;
}
版画
foo
3
foobar
7
  • str0的情况下,其大小与打印字符数匹配。我假设构造函数迭代字符串文字的字符,直到到达\0,这就是为什么在std::string中仅放置'f','o'和'o'的原因,即3个字符,并且不放置字符串终止符在std::string中。
  • 如果是str1,则大小与打印的字符数不匹配。我假设上述操作与上述操作相同,但是我通过分配字符破坏了某些内容。根据cppreference.com的说法,“如果将此字符修改为CharT()以外的任何值,则该行为是不确定的”,因此我认为我在这里进入了不确定的行为。

  • 我的问题是:除了未定义的行为,std::string的大小是否可能与打印字符的数量不匹配,或者实际上是标准所保证的吗?
    (注意:如果该问题的答案在标准版本之间发生了变化,我也想知道这一点)

    最佳答案

    In the case of str1 ... the behavior is undefined if this character is modified to any value other than CharT(), so I assume I've walked into undefined behavior here.


    您的假设是错误的。没有UB的原因有两个:
  • 您确实将元素分配给了'\0',而该元素恰巧与CharT()相同,因此可以很好地定义将该值分配给str1[str1.size()]
  • 此外,如您所演示的,str1.size()为7,而3小于7,因此在范围之内,可以很好地定义为该元素分配任何值。

  • is it possible that the size of a std::string doesn't match the number of printed characters


    是的,有可能。 std::string也可以包含不可打印的字符,因此大小不必与所打印字符的数量相同。您的示例 str1没有未定义的行为,并演示了大小可以与打印字符数不同的方法。
    除了不可打印的字符外,在某些字符编码中(尤其是在unicode中),字素簇可能包含多个字素,这些字素可能包含多个代码点,这些代码点可能包含多个代码单元(代码单元是一个 char对象)。字符串的大小是字符数,即代码单元数。因此,不应期望字符串的大小与打印字符的数量相匹配。

    or is it actually something guaranteed by the standard?


    不存在此类保证。

    if the answer to that question changed between versions of the standard I'm interested in knowing that too


    对此没有任何改变。

    关于c++ - std::string的大小是否总是打印字符的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65073494/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com