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

C语言数据管理器程序运行时后续函数未调用问题求助

解决你的C语言简易数据管理器输入后程序直接结束的问题

嘿,我看到你的问题啦!这是个C语言新手非常容易踩的经典小坑,咱们马上来搞定它。

你的核心问题出在choosetask()函数里的scanf调用上:

scanf ("%d", tasknumber);

scanf函数要求传入变量的内存地址,这样它才能把用户输入的值正确写入到变量里。但你直接传了tasknumber这个变量本身,这会导致scanf把输入的值写到一个随机的内存地址上(因为未初始化的tasknumber是垃圾值),这属于未定义行为——程序可能直接崩溃、提前退出,或者出现各种奇怪的现象,这就是你输入后程序直接结束的原因。

修正后的代码

把scanf的参数改成&tasknumber(取地址运算符&用来获取变量的内存地址),修改后的choosetask()函数如下:

void choosetask () {
    int tasknumber;
    // 这里要传变量的地址&tasknumber
    scanf ("%d", &tasknumber);
    if (tasknumber == 1) {
        newpatient ();
    } else if (tasknumber == 2) {
        assignpatient ();
    } else if (tasknumber == 3) {
        loadhospitaldata ();
    } else if (tasknumber == 4) {
        deletepatient ();
    } else if (tasknumber == 5) {
        exit(0);
    } else {
        printf ("Choose a valid task number, please\n");
        choosetask ();
    }
}

额外的小建议

另外,你当前用递归调用choosetask()来处理无效输入,虽然能工作,但如果用户多次输入无效值,可能会导致栈溢出。更稳妥的方式是用循环来替代递归,比如:

void choosetask () {
    int tasknumber;
    while (1) {
        scanf ("%d", &tasknumber);
        if (tasknumber == 1) {
            newpatient ();
            break; // 执行完任务后退出循环
        } else if (tasknumber == 2) {
            assignpatient ();
            break;
        } else if (tasknumber == 3) {
            loadhospitaldata ();
            break;
        } else if (tasknumber == 4) {
            deletepatient ();
            break;
        } else if (tasknumber == 5) {
            exit(0);
        } else {
            printf ("Choose a valid task number, please\n");
            // 不break,继续循环等待正确输入
        }
    }
}

这样无论用户输入多少次无效值,都不会有栈溢出的风险。

内容的提问来源于stack exchange,提问作者Mohammed Elbagoury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:12:38