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

C语言do while循环内调用scanf导致循环意外中断的原因是什么

问题原因分析

核心错误是 scanf() 调用时的参数传递不符合语法要求:

  • C语言中scanf()读取整数到变量时,需要传入变量的内存地址,才能把用户输入的值写入对应的内存空间。你代码中写的是scanf("%d", guessed),直接传入了未初始化的guessed变量本身的值,而非它的地址,这属于未定义行为。

具体异常逻辑说明

  1. 局部变量guessed定义后没有初始化,存储的是随机的垃圾值。你把这个垃圾值当做内存地址传给scanf()后,系统会尝试把用户输入的整数写入这个随机地址:
    • 如果该地址属于系统受保护的内存区域,程序会直接触发段错误终止运行,这就是你看到输入数字后程序直接退回命令行、连最终的猜对提示都没有打印的原因。
    • 即使运气好该地址可写入,输入的值也只会写到错误的内存位置,guessed本身的值仍然是原来的随机垃圾值。
  2. 循环的退出条件是!check(guessed, num),也就是check判断猜对时退出。guessed的随机值如果刚好和生成的随机数num相等,也会触发循环提前退出,同样属于未定义行为的随机表现。
  3. 注释掉scanf()的版本中你直接给guessed赋值为num,check返回值为真,循环自然正常执行一次后退出,符合预期逻辑。

修复方案

把scanf调用行修改为如下即可:

scanf("%d", &guessed);

如果要进一步优化健壮性,可以加scanf返回值校验,判断用户输入是否为合法整数,避免非法输入导致程序逻辑异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:45:06