C语言do while循环内调用scanf导致循环意外中断的原因是什么
问题原因分析
核心错误是 scanf() 调用时的参数传递不符合语法要求:
- C语言中
scanf()读取整数到变量时,需要传入变量的内存地址,才能把用户输入的值写入对应的内存空间。你代码中写的是scanf("%d", guessed),直接传入了未初始化的guessed变量本身的值,而非它的地址,这属于未定义行为。
具体异常逻辑说明
- 局部变量
guessed定义后没有初始化,存储的是随机的垃圾值。你把这个垃圾值当做内存地址传给scanf()后,系统会尝试把用户输入的整数写入这个随机地址:- 如果该地址属于系统受保护的内存区域,程序会直接触发段错误终止运行,这就是你看到输入数字后程序直接退回命令行、连最终的猜对提示都没有打印的原因。
- 即使运气好该地址可写入,输入的值也只会写到错误的内存位置,
guessed本身的值仍然是原来的随机垃圾值。
- 循环的退出条件是
!check(guessed, num),也就是check判断猜对时退出。guessed的随机值如果刚好和生成的随机数num相等,也会触发循环提前退出,同样属于未定义行为的随机表现。 - 注释掉
scanf()的版本中你直接给guessed赋值为num,check返回值为真,循环自然正常执行一次后退出,符合预期逻辑。
修复方案
把scanf调用行修改为如下即可:
scanf("%d", &guessed);
如果要进一步优化健壮性,可以加scanf返回值校验,判断用户输入是否为合法整数,避免非法输入导致程序逻辑异常。
内容的提问来源于stack exchange,提问作者Pratik Choudhuri
相关产品推荐
相关产品推荐

