c++ - 为什么“在抛出 'std::out_of_range' what(): basic_string::at: __n (which is 0) >= this->size() (which is 0) 的实例后调用终止”?
问题描述
所以,我不断收到
在抛出 'std::out_of_range' 的实例后调用终止
what(): basic_string::at: __n (which is 0) >= this->size() (which is 0)
当我尝试运行我的代码时的消息。我要做的是让它输出存储在第一个花括号和 nm_1 变量中的逗号之间的双精度值。(*对不起,如果我的代码有点乱,那就晚了)
int main() {
std::string funct;
std::cout << "-->";
std::cin >> funct;
if (funct.find("math") != std::string::npos) {
int bracket_pos_1 = funct.find("{");
int bracket_pos_2 = funct.find("}");
int temp = 0;
// int temp_2 = 0;
std::string nm_1;
std::string nm_2;
auto split_string = funct.substr(bracket_pos_1 + 1, bracket_pos_2 - bracket_pos_1 - 1);
// string ss = split_string;
for (int i = 0; i < 2; i) {
std::string nm_1;
string ss = split_string;
if (ss.at(temp) == '0' || ss.at(temp) == '1' ||
ss.at(temp) == '2' || ss.at(temp) == '3' ||
ss.at(temp) == '4' || ss.at(temp) == '5' ||
ss.at(temp) == '6' || ss.at(temp) == '7' ||
ss.at(temp) == '8' || ss.at(temp) == '9') {
nm_1.at(temp) = ss.at(temp);
}
else if (ss.at(temp) == '.') {
nm_1.at(temp) = ss.at(temp);
i++;
}
else if (ss.at(temp) == ',') {
i = 2;
}
temp++;
}
nm_1.at(temp - 1) = '0';
// std::cout << split_string;
cout << endl << endl << nm_1;
}
}
解决方案
第一个问题是这样的:
std::string nm_1;
nm_1.at(temp) = ...
您不能覆盖字符串中不存在的字符。您应该附加到字符串。最简单的方法是使用+=
运算符:
nm_1 += ...
第二个问题是这样的:
std::string nm_1;
for (...) {
std::string nm_1;
nm_1 += ...
您所做的任何修改都nm_1
将发生在循环内的该变量上。问题是该变量在一次迭代结束时被销毁,并在下一次迭代开始时重新创建,因此您在循环内完成的所有修改都将丢失。只需删除该变量定义即可修复它:
std::string nm_1;
for (...) {
nm_1 += ...