如何用C++处理带星期的格式化日期并解决统计次数为0的问题
嘿,我来帮你排查这个统计结果全为0的问题!这种情况十有八九是数据读取不匹配或者字符串比较逻辑出了问题,咱们结合你的场景一步步拆解:
核心问题分析&解决思路
1. 最常见的坑:日期格式读取错误,根本没拿到正确的星期字符串
你的输入格式是dd/mm/yyyy, Weekday,注意逗号后面有个空格。如果直接用cin >> date >> weekday,会把23/10/2005,(带逗号的日期)当成一个整体读入,然后weekday会错误地拿到Sunday后面的下一个日期片段,完全偏离预期。
修正方案:直接拆分日期的日/月/年,跳过分隔符,精准捕获星期:
int day, month, year; char slash, comma; // 用来接收日期里的/和后面的, string weekday; // 用格式化输入自动跳过分隔符 while (infile >> day >> slash >> month >> slash >> year >> comma >> weekday) { // 这里weekday就准确拿到了Sunday、Monday这类字符串 }
2. 大小写/拼写不匹配导致统计失效
比如你判断的是sunday但输入是Sunday,或者输入里有截断的Satu...(比如你示例里的末尾),都会导致匹配失败,计数始终为0。
修正方案:统一转换为小写(或大写)后再统计,同时用哈希表简化计数逻辑:
#include <algorithm> #include <unordered_map> // 辅助函数:字符串转小写 string to_lower(string s) { transform(s.begin(), s.end(), s.begin(), ::tolower); return s; } // 初始化所有星期的计数(避免遗漏未出现的星期) unordered_map<string, int> counts = { {"sunday", 0}, {"monday", 0}, {"tuesday", 0}, {"wednesday", 0}, {"thursday", 0}, {"friday", 0}, {"saturday", 0} }; // 统计时转小写匹配 string lower_wd = to_lower(weekday); if (counts.find(lower_wd) != counts.end()) { counts[lower_wd]++; }
3. 文件读取失败,根本没读到数据
如果你的程序没正确打开输入文件,或者文件路径错误,会直接跳过循环,计数自然全为0。一定要加文件打开校验:
ifstream infile("你的输入文件名.txt"); if (!infile.is_open()) { cerr << "Error: 打不开输入文件!检查路径是否正确" << endl; return 1; }
完整可运行示例代码
把上面的点整合起来,你可以直接用这段代码测试:
#include <iostream> #include <fstream> #include <string> #include <unordered_map> #include <algorithm> using namespace std; string to_lower(string s) { transform(s.begin(), s.end(), s.begin(), ::tolower); return s; } int main() { ifstream infile("dates.txt"); if (!infile.is_open()) { cerr << "Error: 无法打开输入文件,请检查路径!" << endl; return 1; } unordered_map<string, int> counts = { {"sunday", 0}, {"monday", 0}, {"tuesday", 0}, {"wednesday", 0}, {"thursday", 0}, {"friday", 0}, {"saturday", 0} }; int day, month, year; char slash, comma; string weekday; while (infile >> day >> slash >> month >> slash >> year >> comma >> weekday) { string lower_wd = to_lower(weekday); if (counts.count(lower_wd)) { counts[lower_wd]++; } } // 按中文习惯输出结果 cout << "星期日总数:" << counts["sunday"] << endl; cout << "星期一总数:" << counts["monday"] << endl; cout << "星期二总数:" << counts["tuesday"] << endl; cout << "星期三总数:" << counts["wednesday"] << endl; cout << "星期四总数:" << counts["thursday"] << endl; cout << "星期五总数:" << counts["friday"] << endl; cout << "星期六总数:" << counts["saturday"] << endl; infile.close(); return 0; }
最后提醒
运行前记得把dates.txt换成你的实际输入文件名,确保文件和程序在同一目录,或者写全文件路径。如果还有问题,可以打印出每次读取的weekday值,看看是不是和你预期的一致,这样就能快速定位哪里出问题了。
内容的提问来源于stack exchange,提问作者98Kid
相关产品推荐
相关产品推荐

