C++字符串变量赋值时无法获取值导致stoi报错如何解决?
问题根因
- 核心错误是空字符串越界访问:你定义的
string temp默认是空字符串,长度为0,直接通过temp[0]、temp[1]对不存在的下标位置赋值属于未定义行为,赋值操作不会生效,temp始终为空,后续给hr、min、sec赋值后这三个变量也都是空值,stoi(hr)处理空字符串自然会抛出无效参数的错误。 - 额外逻辑问题:你原本判断AM的逻辑写的是
s[len-1]=='A',实际12小时制字符串末尾是M,AM/PM标识在倒数第二位,这个判断永远不会生效;同时循环里手动修改i的逻辑非常容易出错,完全可以用字符串的substr方法直接截取对应位置的子串,简化逻辑避免出错。
修复方案
你可以直接用substr截取时分秒的对应段,不需要手动遍历赋值:
- 小时对应原字符串前2位:
s.substr(0,2) - 分钟对应原字符串索引3开始的2位:
s.substr(3,2) - 秒对应原字符串索引6开始的2位:
s.substr(6,2)
修复后完整代码
#include <bits/stdc++.h> using namespace std; int main() { string s = "07:05:45PM"; // 预期输出字符串格式的"19:05:45" int len = s.length(); string Time; string hr, min, sec; // 直接截取对应位置的子串,避免遍历赋值出错 hr = s.substr(0, 2); min = s.substr(3, 2); sec = s.substr(6, 2); if (s[len-2] == 'A') // 取倒数第二位判断AM/PM { if (hr == "12") hr = "00"; } else { if (hr != "12") { hr = to_string(stoi(hr) + 12); } } Time.append(hr); Time.append(":"); Time.append(min); Time.append(":"); Time.append(sec); cout << Time; return 0; }
运行上述代码可以正确输出19:05:45,符合预期。
如果一定要保留你原本遍历赋值的写法,只需要把string temp修改为string temp(2, ' '),预先给temp分配2个字符的长度即可解决越界问题。
内容的提问来源于stack exchange,提问作者Muhammed Nadeem
相关产品推荐
相关产品推荐

