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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:37:14