c++ 断言字符串迭代器偏移超出范围

Posted

技术标签:

【中文标题】c++ 断言字符串迭代器偏移超出范围【英文标题】:c++ assertion string iterator offset out of reange 【发布时间】:2021-01-07 00:10:28 【问题描述】:

我的断言失败。它在cin之后显示。我还检查了它显示路径的文件,但没有解决方案。 “字符串迭代器+偏移超出范围”是它显示的按摩。它发生在我在第 65 行使用“cin >> a”之后。有人可以帮助我吗?提前致谢。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;

int gcd(int a, int b)
cout << "gcd" << endl;
if (b == 0) return a;
else return gcd(b, a % b);


int gcd_n(vector<int>nums)
int g;

size_t n = nums.size();
    
g = nums.at(0);
cout << "son" << endl;
for (int i = 1; i < n; i++)
        
    g = gcd(nums.at(i), g);

return g;


long long int multi_vect(vector<int> v)
long long int m = 1;

for (size_t i = 0; i < v.size(); i++)   
    m *= v.at(i);
return m;


int main() 
int a;
vector <vector<int>> all_vects;
cin >> a;
string input, sub;

getline(cin, input);
int n = input.find(' ');
vector<int> vect;
while(true)

    int num;
    sub = input.substr(0, n);
    istringstream(sub) >> num;
    vect.push_back(num);

    input = input.substr(n+1, input.back()+1);  
    n = input.find(' ');
    if (n == -1)
        istringstream(input) >> num;
        vect.push_back(num);
        break;
    

all_vects.push_back(vect);

【问题讨论】:

似乎问题在于input 不包含空格并且代码从那里走下坡路。 input 将为空,因为cin &gt;&gt; a; 离开换行符,该换行符将在那里结束来自getline 的输入。 延伸阅读***.com/questions/21567291/… 你希望input.back()+1 做什么? @AlanBirtles 我删除了输入中的第一个数字。这是为了在一行中获取多个整数。 【参考方案1】:

我在测试这段代码的时候发现n=-1需要提前判断。假设input。假设字符串input没有' ',那么n就会变成-1,而sub = input.substr(0, n);不成立。因此,向量vect 将为空。这就是string iterator + offset out of range会出现的原因。

以下是我对此代码的更改。你可以参考一下。

    if (n == -1) 
    
        istringstream(input) >> num;
        vect.push_back(num);
        break;
    
    else 
        sub = input.substr(0, n);
        istringstream(sub) >> num;
        vect.push_back(num);

        input = input.substr(n + 1, input.back() + 1);
        n = input.find(' ');
    

【讨论】:

以上是关于c++ 断言字符串迭代器偏移超出范围的主要内容,如果未能解决你的问题,请参考以下文章

C ++ - 向量迭代器+偏移超出范围

std::advance - 仅在调试时偏移超出范围失败

矢量擦除迭代器超出范围[关闭]

C++ 调试断言失败。向量下标超出范围

调试断言失败,向量下标超出范围

“向量擦除迭代器超出范围”错误