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
相关产品推荐
相关产品推荐

