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

从命令行读取日期参数传入getDateKey函数后返回值异常

问题原因分析

1. 参数传递顺序完全错误

你用sscanf解析日期时,变量顺序搞反了:
输入的日期格式是月/日/年(比如9/27/2022对应9月27日2022年),但你写的代码是:

sscanf(argv[1], "%d/%d/%d", &d, &mm, &yyyy);

这会把9赋值给d(日),27赋值给mm(月),调用getDateKey(d, mm, yyyy)时就变成了传入日=9,月=27,年=2022——月份27完全超出合法范围,循环for(i=1; i<month; i++)会执行26次,累加大量错误数值,结果必然异常。

正确的解析顺序应该是:

sscanf(argv[1], "%d/%d/%d", &mm, &d, &yyyy);

这样mm接收月份9,d接收日期27,和你直接调用getDateKey(9,27,2022)的参数完全一致。

2. key变量未初始化

在getDateKey函数里,你定义了int i, key, check = 0;,但key没有赋初始值,它的初始值是栈上的随机垃圾数据。
第一次直接传参调用时,刚好栈里的key初始值是0,所以计算结果正确;第二次调用时,栈里的key初始值是随机负数,累加后就出现了异常的负数结果。

必须给key初始化:

int i, key = 0, check = 0;

额外问题:内存泄漏

你的main函数里有两行完全无用的代码:

char* a = (char*)malloc(sizeof(char));
a = argv[1];

malloc分配的内存地址被直接覆盖,造成内存泄漏,建议直接删除这两行。

修复后的关键代码片段

修正后的main函数

int main(int argc, char* argv[]) {
    int x, y, d, mm, yyyy;
    x = getDateKey(9, 27, 2022);
    printf("%d\n", x);
    // 修正sscanf的变量顺序
    sscanf(argv[1], "%d/%d/%d", &mm, &d, &yyyy);
    y = getDateKey(mm, d, yyyy);
    printf("%d\n", y);
    return 0;
}

修正后的getDateKey函数

int getDateKey(int month, int day, int year) {
        int i, key = 0, check = 0; // 初始化key为0
        if(isLeap(year)){
                check = 1;
        }
        // 额外补充:增加月份合法性判断,避免非法输入
        if(month <1 || month >12) {
            printf("Invalid month\n");
            return -1;
        }
        for(i = 1; i < month; i++) {
                if(i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {
                        key += 31;
                } else if(i == 2) {
                        if(check) {
                                key += 29;
                        } else {
                                key += 28;
                        }
                } else {
                        key += 30;
                }
        }
        return key += day;
}

内容的提问来源于stack exchange,提问作者Patrick Wong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:30:53