C++循环中调用replace函数触发越界错误的原因咨询
字符串替换触发"out of range"错误的原因分析
需求是将密码字符串中的非数字字符替换为'0'(例如输入32L04输出32004),但以下代码在for循环中调用replace函数时触发了越界错误,改用passPhrase.at(i) = '0';则可正常运行,具体错误原因如下:
原错误代码
string passPhrase; unsigned int i; cin >> passPhrase; for (i = 0; i < passPhrase.size(); ++i) { if (!isdigit(passPhrase.at(i))) { passPhrase.replace(passPhrase.at(i), 1, "0"); } } cout << "Adjusted password: " << passPhrase << endl;
错误原因
- 核心问题是用错了
std::string::replace的参数规则:这个函数的第一个参数要求传入替换起始位置的索引(即从第几个字符开始替换),但你传的是passPhrase.at(i)——这是当前位置的字符本身,比如字符'L'的ASCII码是76,如果字符串长度远小于76,直接就会触发越界。 - 举个实际例子:输入
32L04时,字符串长度是5,当循环到i=2时,passPhrase.at(i)是字符'L',对应的ASCII值是76,调用replace(76, 1, "0")相当于要从第77个字符开始替换,但字符串总共才5个字符,必然触发out_of_range异常。 - 而
passPhrase.at(i) = '0';是直接通过索引修改对应位置的字符,参数逻辑正确,所以不会出错。
内容的提问来源于stack exchange,提问作者user22099685
相关产品推荐
相关产品推荐

