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
相关产品推荐
相关产品推荐

