输入非y/n字符时,循环为何重复两次提示有效字符要求?
问题分析与解决
核心问题原因
- 重复读取输入:开头用
get_char读取了一次输入,后续do-while循环里又用scanf读取,导致输入逻辑混乱。 - 未处理换行符:
scanf("%c", &answer)会读取输入的所有字符,包括用户按下回车产生的换行符\n。当你输入a加回车时,第一次scanf读走a,第二次循环读走\n,这两个字符都不是y/n,所以触发两次提示。 - 循环条件逻辑错误:原代码
while (answer != 'y' || answer != 'n')永远为真(一个字符不可能同时是y和n),只能靠break强制退出循环,逻辑不严谨。
修正后的代码
#include <cs50.h> #include <stdio.h> int main(void) { char answer; do{ printf("Do You Agree? y/n \n"); // 前面加空格,自动跳过所有空白字符(换行、空格等) scanf(" %c", &answer); if (answer == 'y') { printf("Great!\n"); break; } else if(answer == 'n') { printf("That's unfortunate\n"); break; } else { printf("only y/n please.\n"); } }while (answer != 'y' && answer != 'n'); }
关键修改说明
- 移除开头的
get_char,统一用printf输出提示,避免重复读取输入。 scanf改为" %c":前面的空格会过滤掉输入中的空白字符(比如回车产生的\n),确保每次只读取有效字符。- 修正循环条件为
answer != 'y' && answer != 'n':只有当输入既不是y也不是n时才继续循环,逻辑更清晰。
运行效果验证
输入非y/n字符时,只会提示一次;输入y或n时,正常输出对应内容并退出程序。
内容的提问来源于stack exchange,提问作者jaudiola
相关产品推荐
相关产品推荐

