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未初始化就返回,属于未定义行为。
解决方案
- 修正字符输入逻辑:把读取
ans的语句改成scanf(" %c", &ans),注意%c前面的空格,会自动跳过缓冲区里残留的空格、换行符等空白字符,避免直接读取残留换行。 - 修正
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; }
- 修正用户名输入逻辑:改成
scanf("%5s", name);,限制最多读5个字符避免溢出,去掉多余的&符号。 - 在需要换行的输出语句末尾添加
\n,保证内容及时刷新输出避免粘连,比如printf("return 2\n");。 - 补全
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
相关产品推荐
相关产品推荐

