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

C++中带前导零的int为何输出异常?如何去除前导零?

解决HHMM格式时间转分钟数的问题

首先要明确一个关键问题:你写的0530在C++里是八进制整数字面量,转成十进制是5*64 + 3*8 + 0 = 344,这就是为什么直接用它计算或取模都会得到344——整数本身已经丢失了前导零的信息,不再是你想要的"0530"对应的十进制530了。

要正确计算自0000起的分钟数,有两种可行方案:

方案1:用字符串处理(推荐,保留前导零信息)

直接将时间作为字符串读取,拆分出小时和分钟部分再转换为整数计算:

#include <string>
#include <iostream>

int main() {
    std::string time_str = "0530";
    // 提取前两位作为小时,后两位作为分钟
    int hour = std::stoi(time_str.substr(0, 2));
    int minute = std::stoi(time_str.substr(2, 2));
    int total_minutes = hour * 60 + minute;
    std::cout << total_minutes << std::endl; // 输出330(5*60+30)
    return 0;
}

如果是从标准输入读取时间,直接读字符串即可,避免整数解析丢失前导零:

std::string time_str;
std::cin >> time_str;
// 后续处理同上

方案2:用十进制整数处理(需避免八进制写法)

如果一定要用整数,确保输入的是十进制的530(不要加前导零),然后通过数学运算拆分小时和分钟:

#include <iostream>

int main() {
    int time_num = 530; // 注意:不要写0530,这会被解析为八进制
    int hour = time_num / 100;   // 取前两位:530/100=5
    int minute = time_num % 100; // 取后两位:530%100=30
    int total_minutes = hour * 60 + minute;
    std::cout << total_minutes << std::endl; // 输出330
    return 0;
}

关于你提到的「类似setfill()反向功能」:setfill是用于输出时填充字符,反向需求本质是保留输入的前导零,但整数类型本身不存储前导零信息,因此必须用字符串来承载这类带前导零的格式数据,才能正确拆分出小时和分钟。

内容的提问来源于stack exchange,提问作者Victor Bourov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:55:22