Pri*_*Raj 3 c++ stl insert stdstring c++-standard-library
我尝试了以下程序:
#include <iostream>
#include <string>
int main ()
{
std::string str;
str[0] = 'o';
str[1] = 'k';
std::cout << str.length();
std::cout << "as a whole :";
std::cout << str << std::endl;
std::cout << "character by character :";
std::cout << str[0] << str[1] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我不能使用object变量将字符串整体打印出来,为什么返回长度,0
因为显然我已经使用下标运算符添加了字符,因为这将返回char引用,所以我知道这是合法的。
另外,我没有得到任何例外。就是这样。显然,std::string
班上的幕后发生了很多事情,我知道我错过了一些东西。有人可以帮我吗?
我不明白为什么我无法整体打印字符串[...] ...
因为您正在经历未定义的行为。
这个
std::string str;
Run Code Online (Sandbox Code Playgroud)
构造一个带有0
内存分配的默认字符串。这意味着修改过孔std::string::operator[]
将导致资产超出范围的未定义行为。因此,任何事情都可能发生。在您的情况下,长度返回0
。
[...]显然我已经使用下标运算符添加了字符,因为这将返回char引用,因此我知道这是合法的。
不,你没有,对于上述提到的原因。供参考,std::string::operator[]
返回对指定位置pos处字符的引用。不 执行边界检查。如果pos> size(),则行为未定义。
作为可能的修复,您可能需要std::string::resize
先访问元素。
#include <string>
std::string str;
str.resize(2);
str[0] = 'o';
str[1] = 'k';
// ... now it has defined behaviour
Run Code Online (Sandbox Code Playgroud)
或 std::string::push_back
每个字符插入字符串。
#include <string>
std::string str;
str.push_back('o');
str.push_back('k');
// ... now it has defined behaviour
Run Code Online (Sandbox Code Playgroud)
您有一个字符串长度0
,然后尝试使用下标运算符修改其内容。这是未定义的行为,因此在这一点上,无法保证任何特定的结果。如果at()
改用它,它将暴露出错误并引发异常。
为什么长度返回为0
它始于0
,您没有添加任何内容(例如push_back
或+=
)。但是话又说回来,由于您之前所做的是未定义的行为,因此此处可能会发生任何事情。
另外,我没有任何异常。
您可以尝试std::string::at
改用,尝试时会抛出std::out_of_range
异常。