运行C语言代码时自动读取空格字符,该如何解决?
C语言scanf自动读取空白字符问题解决办法
问题描述
运行C语言代码时,程序会自动读取空白字符(无需手动输入),且出现两次该情况。
故障代码
#include <stdio.h> #include <stdlib.h> void fak(int); int main() { int num; printf("ENTER A NUMBER:"); scanf("%d",&num); fak(num); } void fak(int num) { int i=num; for(;i>=0;i--) { char a; printf("ENTER A CHAR:"); scanf("%c",&a); if('A'<=a&&a<='Z'||'a'<=a&&a<='z') printf("%c IS A CHAR.",a); else if (a>='0' && a<='9') printf("%c IS A INT.",a); else printf("%c SPECIAL CHAR",a); } }
故障现象
输入数字并按下回车后,后续的ENTER A CHAR:提示会直接跳过两次,程序自动读取到换行符并判定为特殊字符。
问题原因
scanf("%d", &num)读取整数时,仅会处理数字字符,输入数字后按下的**换行符\n**会残留在输入缓冲区中。后续调用scanf("%c", &a)时,会直接读取缓冲区里的残留换行符,无需手动输入就完成了读取操作,循环执行两次就会出现两次自动读取的情况。
解决办法
方案1:在scanf("%c")前忽略空白字符
在%c格式串前添加一个空格,scanf会自动忽略所有空白字符(包括换行、空格、制表符),修改后的读取代码如下:
printf("ENTER A CHAR:"); // 格式串前加空格,自动跳过空白字符 scanf(" %c",&a);
方案2:手动清空输入缓冲区
在读取字符前,用getchar()吃掉缓冲区中残留的换行符。如果每次输入字符后也会按下回车,需要在读取后再调用一次getchar():
void fak(int num) { int i=num; // 吃掉输入数字后残留的换行符 getchar(); for(;i>=0;i--) { char a; printf("ENTER A CHAR:"); scanf("%c",&a); // 吃掉输入字符后残留的换行符 getchar(); if('A'<=a&&a<='Z'||'a'<=a&&a<='z') printf("%c IS A CHAR.\n",a); else if (a>='0' && a<='9') printf("%c IS A INT.\n",a); else printf("%c SPECIAL CHAR\n",a); } }
注意:
fflush(stdin)虽然能清空缓冲区,但属于C标准未定义行为,仅部分编译器支持,不推荐跨平台使用。
内容的提问来源于stack exchange,提问作者renodake
相关产品推荐
相关产品推荐

