C++处理Oct 15 2021格式日期转数字串的前导零及年份问题求解
C++ 日期格式转换修复方案
核心问题修复点
- 兼容月份大小写输入:将提取的月份统一转小写后匹配,避免
Oct这类首字母大写的输入匹配失败 - 月/日补前导零:引入
<iomanip>格式化库,输出时设置固定宽度2位,不足自动补前导零 - 年份仅保留后两位:年份转换为整数后对100取模,2000年前后的年份都能正确输出最后两位
- 支持输出
MMDDYY格式结果,也可直接将三个值存入整数数组返回
修复后完整代码
#include <conio.h> #include <string> #include <iostream> #include <cctype> #include <iomanip> // 新增格式化输出头文件 using namespace std; bool GetDate(int* dptr, int* mptr, int* yptr) { string date, day, month, year; cout << "\n Please enter a date: "; getline(cin, date); month = date.substr(0, 3); // 月份转小写,兼容大小写输入 for (char& c : month) { c = tolower(c); } day = date.substr(4, 2); year = date.substr(8, 4); string month_array[12] = { "jan","feb","mar","apr","may","jun", "jul","aug","sep","oct","nov","dec" }; bool monthMatch = false; for (int i = 0; i < 12; ++i) { if (month == month_array[i]) { *mptr = i + 1; monthMatch = true; break; } } // 增加月份匹配失败的校验 if (!monthMatch) { return false; } *dptr = stoi(day); *yptr = stoi(year) % 100; // 年份取模100,仅保留后两位 return true; } int main() { int day, month, year; int* d = &day, * m = &month, * y = &year; if (GetDate(d, m, y)) { // 格式化输出,补前导零,输出MMDDYY格式 cout << "\n\n\n formatted date is: " << setfill('0') << setw(2) << month << setw(2) << day << setw(2) << year << endl; // 如果需要整数数组,直接声明即可,整数本身不存储前导零,输出时格式化即可 int dateArr[3] = {month, day, year}; // 可按需使用dateArr数组 } else { cout << "incorrect date"; } _getch(); return 0; }
注意说明
整数类型本身无法存储前导零,所以如果需要保留前导零的存储格式,可以将结果存入字符串数组,数值场景下仅在输出时做格式化处理即可。
内容的提问来源于stack exchange,提问作者Vahan Man
相关产品推荐
相关产品推荐

