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

do-while循环异常:输入's'或'h'仍触发错误提示

嘿,我来帮你揪出这个bug!你的代码里有几个关键细节没处理对,才导致不管输入s还是h都会触发错误提示,咱们逐个解决:

问题1:scanf的格式符写错了

你用了scanf("%ch", &decision);,这里多了个多余的h,正确的格式符应该是%c。这个错误会让scanf的读取逻辑混乱,根本没法正确获取你输入的字符。

问题2:tolower的返回值没赋值

tolower(decision);这个函数不会直接修改原变量,它只会返回转换后的小写字符。所以你得把返回值重新赋值给decision,也就是写成decision = tolower(decision);,这样变量才会变成小写的h或s,后续的判断才能生效。

问题3:循环内重复scanf的冗余逻辑

你在错误提示的分支里又重复写了输入提示和scanf,这完全没必要——do-while循环本身就是用来重复执行输入逻辑的,重复写反而会让流程混乱,甚至导致连续读取两次输入。

额外小坑:输入缓冲区的换行符

当你输入字符后按回车,换行符会留在输入缓冲区里,下一次scanf("%c")会直接读取这个换行符,导致判断错误。解决办法是在%c前面加个空格:scanf(" %c", &decision);,这个空格会自动跳过所有空白字符(包括换行、空格),确保读取到的是用户输入的有效字符。

修正后的完整代码片段

char decision;
do {
    printf("Do you want to (H)it or (S)tand? ");
    // 加空格跳过空白字符,修正格式符
    scanf(" %c", &decision);
    // 赋值转换后的小写字符
    decision = tolower(decision);
    
    if (decision != 'h' && decision != 's') {
        printf("Pick 's' or 'h'. Try again.\n");
    }
// 循环条件:输入不正确就继续循环
} while (decision != 'h' && decision != 's');

// 处理Hit的逻辑
if (decision == 'h') {
    // 你的业务代码...
}

内容的提问来源于stack exchange,提问作者Stacy Willis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:47:46