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

C语言迷你卡拉OK系统循环运行时跳过用户输入问题求解

问题原因
  • 核心诱因是输入缓冲区残留换行符:第一次执行scanf("%c", &ans)读取Y/N时,用户输入字符后按下的回车(\n)会残留在标准输入缓冲区中。下一次循环调用start函数执行scanf("%c")时,会直接读取缓冲区里的换行符,不会等待用户输入,直接进入ans != 'N'的分支,表现为跳过输入步骤。
  • 辅助逻辑错误1:checkName函数逻辑异常,循环边界写了i < 6但usern数组只有5个元素,会造成数组越界;且循环内只要第一个元素不匹配就直接返回1,没有遍历所有已存储的用户名,无法正确判断后续位置的重名情况。
  • 辅助逻辑错误2:读取用户名的scanf("%s", &name)写法错误,name本身是数组首地址,不需要加取地址符&,且没有限制输入长度,容易造成缓冲区溢出。
  • 辅助逻辑错误3:部分printf没有加换行符,输出缓冲区未及时刷新,会导致输出内容粘连。
  • 辅助逻辑错误4:gtime函数中局部变量ttime未初始化就返回,属于未定义行为。
解决方案
  1. 修正字符输入逻辑:把读取ans的语句改成scanf(" %c", &ans),注意%c前面的空格,会自动跳过缓冲区里残留的空格、换行符等空白字符,避免直接读取残留换行。
  2. 修正checkName函数逻辑:
int checkName(char name[]){
    int i;
    // 遍历所有5个用户存储位
    for (i = 0; i < 5; i++){
        if(strcmp(name, usern[i]) == 0){
            printf("This username already exists. Please try again. \n");
            return 0;
        }
    }
    // 全部遍历完没有重名才返回1
    return 1;
}
  1. 修正用户名输入逻辑:改成scanf("%5s", name);,限制最多读5个字符避免溢出,去掉多余的&符号。
  2. 在需要换行的输出语句末尾添加\n,保证内容及时刷新输出避免粘连,比如printf("return 2\n");。
  3. 补全main函数的循环逻辑,以及gtime的初始化逻辑:
int gtime(){
    clock_t ttime = clock(); // 初始化获取当前时钟计数
    return ttime;
}

int main(void){
    printf("%d \n", gtime());
    while(1) { // 死循环实现程序持续运行
        start();
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:36:00