为什么我的C语言代码运行时仅能输入患者姓名,无法录入其余信息?
程序运行异常的核心原因
这段代码存在多处输入流处理、格式匹配的硬错误,直接导致程序卡在姓名输入环节、后续录入流程完全无法推进,具体问题点:
- scanf格式符与变量类型不匹配,造成输入缓冲区阻塞
读取患者姓名的语句scanf("%d", name);存在类型错配:%d是用于读取整数的格式符,但患者姓名是存储字符串的字符数组。当用户输入包含字母、中文的姓名内容时,scanf识别到输入不符合%d要求的纯数字格式,会直接终止本次读取操作,且不会清除已经留在输入缓冲区的无效字符。后续所有scanf语句执行时,都会优先读取缓冲区里的残留无效内容,直接触发格式匹配失败,根本不会等待用户的键盘输入,最终表现为输入完姓名后程序直接跳过所有后续录入步骤。 - scanf的格式说明符数量与传入参数不匹配
读取出生日期的语句scanf("%s", birthmonth, birthday, birthyear);存在参数错配:格式列表仅写了1个%s,却在参数位传了3个数组地址。按照scanf的匹配规则,1个%s只会读取一段连续非空白的字符串存入第一个birthmonth的地址,剩下两个birthmonth、birthyear对应的参数完全没有被格式说明符匹配,既会造成内存越界,也会打乱输入流的匹配节奏——用户输入完分段的出生日期内容后,缓冲区里残留的其余字符会直接被后续读取性别的scanf捕获,程序会跳过用户的性别输入环节。 - 分支判断误用赋值运算符
分支判断写为if (choice=1),这是将常量1赋值给choice的赋值操作,而非判断choice是否等于1的相等比较,会导致这个分支永远被触发,属于逻辑错误,修正需要写为if (choice == 1)。 - 非标准函数的兼容问题
代码中使用的getch()是依赖conio.h头文件的非标准库函数,在标准C编译环境下无法直接运行,需要替换为标准库的getchar()配合输入缓冲区清理逻辑实现按任意键继续的效果。
内容的提问来源于stack exchange,提问作者jessi_jebbie
相关产品推荐
相关产品推荐

