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

时间:2017-07-21 12:53:26

标签: c++ vector iterator

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

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.

没有关于如何解决这个问题的线索,你们,善良的堆栈溢出者会帮助我吗?

2 个答案:

答案 0 :(得分:1)

您不需要std::vector<char>因为std::string本身就拥有您需要的所有功能。使用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 :(得分:0)

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

  1. 首先需要知道的是,在顺序容器上执行插入/删除操作时,迭代器可能无效。

  2. 上一个i <= c.size()循环中的语句for应为i < c.size()

  3. 实际上,您不需要使用其他vector<char>。只需使用to_string生成的字符串即可。