从命令行读取日期参数传入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
相关产品推荐
相关产品推荐

