You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:45:04