C语言do..while循环嵌入if..else语句及循环不运行问题排查
问题原因
你的程序无法正常循环的核心原因是输入缓冲区残留的换行符被%c格式符错误读取:
- 每次输入内容后按下的回车键会在输入缓冲区生成一个
\n换行符 %d格式符读取数字时会自动跳过前置的空白字符,但%c不会跳过任何字符,会直接读取残留的换行符- 换行符不属于字母,会直接触发非字母错误提示,导致看起来跳过了用户输入字母的步骤,循环逻辑异常
修复方法
最简单的修复方案是给读取字母的scanf的格式符前加一个空格,空格会自动匹配并跳过所有前置空白字符(包括换行符、空格、制表符),确保能读取到用户输入的有效字母:
将原有代码中scanf("%c", &alphabet);
修改为scanf(" %c", &alphabet);
修正后完整代码
#include <stdio.h> #include <ctype.h> int main(void){ char alphabet; char confirm; int lowercase_vowel, uppercase_vowel; int a =1; do{ printf("Enter an alphabet: "); // 格式符前加空格跳过残留空白字符 scanf(" %c", &alphabet); // evaluates to 1 if variable c is a lowercase vowel lowercase_vowel = (alphabet == 'a' || alphabet == 'e' || alphabet == 'i' || alphabet == 'o' || alphabet == 'u'); // evaluates to 1 if variable c is a uppercase vowel uppercase_vowel = (alphabet == 'A' || alphabet == 'E' || alphabet == 'I' || alphabet == 'O' || alphabet == 'U'); if(!isalpha(alphabet)) { printf("Error! Non-alphabetic character.\n"); } else if(lowercase_vowel || uppercase_vowel) { printf("%c is a vowel.\n", alphabet); } else { printf("%c is a consonant.\n", alphabet); } printf("\nif u want to proceed enter 1, if not enter 0\n"); scanf("%d", &a); }while( a == 1); }
内容的提问来源于stack exchange,提问作者Muhd Farhan
相关产品推荐
相关产品推荐

