使用向量的函数崩溃,调试器说访问冲突读取位置



在我说什么之前,让我发布我的代码。

string formatNumber(llint num){
if (num <= 999) return to_string(num);
vector<char> c;
for (int i = 0; i <= to_string(num).length()-1; i++) {
c.push_back(to_string(num)[i]);
}
auto it = c.end();
for (int i = c.size() - 1; i >= c.size() - 1; i--) {
if (i >= 3 && i % 3 == 0) {
it = c.insert(it + i, ',', 1);
}
it--;
}
string Return;
for (int i = 0; i <= c.size(); i++) {
Return += c[i];
}
return Return;
}

此函数的重点是格式化数字多于三的数字,使其更容易阅读。像这样:1000 将变成 1,000。基本上,它从左起每 3 位数字添加一个逗号。我的问题是我的程序如何崩溃并引发此异常:

Exception thrown at 0x00007FFC24A2C447 (vcruntime140.dll) in RESL.exe: 0xC0000005: Access violation reading location 0x00000223F53C2000.

不知道如何解决这个问题,你会,堆栈溢出的好心人帮助我吗?

您不需要std::vector<char>因为std::string本身具有您需要的所有功能。使用字符串将消除大部分代码,您只需要一个循环:

std::string s = std::to_string( num );
const auto size = s.length(); // we need to keep it as it would change on insertion
for( size_t i = 3; i < size; i += 3 )
s.insert( size - i, 1, ',' );

代码中的错误太多,例如:

  1. 您需要知道的第一件事是,当您对顺序容器执行插入/删除操作时,迭代器可能无效。

  2. 最后一个for循环中i <= c.size()语句应i < c.size()

实际上,您不需要使用其他vector<char>。只需使用to_string生成的字符串就足够了。