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

while循环条件无效时内部任务仍执行?C语言月份校验程序疑问

为什么我的C语言月份校验程序会重复要求输入有效月份?

你的代码

int monthcheck(int m) { 
    int month = 0; 
    while (m <= 0 || m > 12) { 
        printf("Month must be between 1 and 12, re-enter month:"); 
        scanf("%d", &m); 
    } 
    if (m == 2) { 
        month = 1; // February 
    } 
    if (m==1||m==3||m==5||m==7||m==8||m==10||m==12) 
        month=2; 
    return month; 
} 

int main() { 
    int m; 
    printf("Enter month"); 
    scanf("%d",&m); 
    if (monthcheck(m)==0) 
        printf("The month is valid"); 
    else if (monthcheck(m)==1) 
        printf("The month is february"); 
}

程序输出

Enter month-2
Month must be between 1 and 12, re-enter month:13
Month must be between 1 and 12, re-enter month:2
Month must be between 1 and 12, re-enter month:2
The month is february

问题原因

核心问题出在两次调用monthcheck(m),且C语言函数参数是传值传递:

  1. 第一次调用monthcheck(m)时,函数内部的m是main函数中m的副本——你最初输入的-2会被复制一份到函数里,循环中修改的只是这个副本的值(最终改成了2),但main函数里的原始m变量依然是-2。
  2. 当执行到else if (monthcheck(m)==1)时,你再次把原始的-2传给了monthcheck,函数会重新进入校验循环,要求你输入有效月份,直到你输入2才会退出循环并返回结果。

修复方案

方案1:只调用一次校验函数(推荐)

把monthcheck的返回值先存到变量里,再进行判断,避免重复调用:

int main() { 
    int m; 
    printf("Enter month"); 
    scanf("%d",&m); 
    // 只调用一次校验函数,保存结果
    int checkResult = monthcheck(m); 
    if (checkResult == 0) 
        printf("The month is valid"); 
    else if (checkResult == 1) 
        printf("The month is february"); 
}

方案2:使用指针传参修改原始变量

如果希望main函数里的m也被更新为有效月份,可以用指针传递参数:

// 修改函数参数为指针
int monthcheck(int *m) { 
    int month = 0; 
    while (*m <= 0 || *m > 12) { 
        printf("Month must be between 1 and 12, re-enter month:"); 
        // 直接修改指针指向的原始变量
        scanf("%d", m); 
    } 
    if (*m == 2) { 
        month = 1; // February 
    } 
    // 用else if避免覆盖之前的赋值
    else if (*m==1||*m==3||*m==5||*m==7||*m==8||*m==10||*m==12) 
        month=2; 
    return month; 
} 

int main() { 
    int m; 
    printf("Enter month"); 
    scanf("%d",&m); 
    // 传递变量地址
    int checkResult = monthcheck(&m); 
    if (checkResult == 0) 
        printf("The month is valid"); 
    else if (checkResult == 1) 
        printf("The month is february"); 
}

额外优化点

原代码中第二个if会存在逻辑覆盖风险(比如后续调整条件时可能出错),建议改成else if让逻辑更清晰:

if (m == 2) {
    month = 1; // February
} else if (m == 1||m == 3||m == 5||m == 7||m == 8||m == 10||m == 12) {
    month = 2;
}
// 其余月份(4、6、9、11)month保持0

内容的提问来源于stack exchange,提问作者Johnny K18 HCM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:10:43