处理未知次数迭代的关键是明确终止条件:while先判断后执行,适用于可能零次执行的场景;do-while至少执行一次,适合必须先操作再判断的情况。

处理未知次数的迭代,关键不是“选哪个循环”,而是“搞清终止条件怎么定”。while 和 do-while 的本质区别在于:前者先判断再执行,后者至少执行一次再判断。初学时容易卡在“不知道该用哪个”,其实只要明确输入来源和容错需求,选择就很自然。
用 while 处理可能一次都不执行的情况
当你需要“检查条件满足才开始干活”,比如读取用户输入直到输入合法数字、从文件逐行读取直到遇到空行、或等待某个外部状态就绪,while 更安全直接。
常见写法是把条件判断放在循环头部,每次迭代前都重新评估:
- 先初始化变量(如 int input = 0;)
- 条件写成 while (input 100),表示“只要输入无效就继续”
- 循环体内必须包含更新动作(如 scanf("%d", &input);),否则容易死循环
用 do-while 确保至少执行一次操作
适合那些“必须先做一次,再看要不要继续”的场景,比如菜单式交互、密码重试、或初始化后校验。它天然避免了重复写初始化逻辑。
结构上,把核心操作放在 do { ... } 块里,把继续条件写在 while(...) 尾部:
- 例如让用户输入密码,不管第一次对不对,都要提示并接收——do { printf("请输入密码: "); scanf("%s", pwd); } while (strcmp(pwd, "123") != 0);
- 注意:条件是“继续循环”的条件,不是“退出条件”,所以要写成 != 或 == 0 这类反向表达
- 循环体末尾必须有能影响条件的语句,否则会无限执行第一次的结果
别忽略输入缓冲区和类型匹配问题
初学最容易在这里翻车:用 scanf 读数字后,紧接着用 getchar 或 fgets 读字符,结果跳过输入——因为回车符还留在缓冲区里。
简单应对方法:
- 读完数字后加一句 while (getchar() != '\n'); 清空当前行剩余字符
- 统一用 fgets 读整行,再用 sscanf 解析,更可控
- 每次读取后检查返回值(如 scanf 返回值是否为 1),防止用户输字母导致循环卡死
调试时加一行输出,比猜快十倍
不确定循环有没有跑、跑几次、变量值是多少?在循环开头或结尾加一句 printf("i = %d, condition = %d\n", i, flag);,马上看清执行路径。
尤其对 do-while,多打一次输出能立刻确认“是不是真执行了第一次”,也方便发现条件更新是否滞后。
不复杂但容易忽略。











