使用scanf字符输入时遇到的问题

今天用scanf给一字符数组循环复制时遇到了问题

#include"stdio.h"
int main()
{
int n =10;
char a[10];
int i =0;
for(;i<n;i++)
{
printf("(i=%d)",i);
scanf("%c",&a[i]);
}
a[9] = '\0';
printf("%s",a);
return 0;

}

发现scanf会被跳过,搜了一下网

原来scanf(或者getchar)是从标准输入缓冲区中读取输入的数据,而%c的字符输入格式会接收回车字符,在输入第一个scanf(或者getchar)时输入字符后按回车结束,输入缓冲中保存了这个回车符,遇到第二个scanf(或者getchar)时,它自动把这个回车符赋给了ch2。而如果第二个scanf的输入格式不是%c时,由于格式不匹配,这个回车符会被自动忽略,所以只有在连续输入两个%c的格式时才会出现这样的问题!

解决方法

#include"stdio.h"
int main()
{
int n =10;
char a[10];
int i =0;
for(;i<n;i++)
{
printf("(i=%d)",i);
scanf(" %c",&a[i]); //1.在前面加一个空格,进行格式控制
fflush(stdin); //2.清空标准输入缓冲区
}
a[9] = '\0';
printf("%s",a);
return 0;

}
特别注意 方法2

C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说用 fflush(stdin) 解决不了这个问题,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,经我的GCC红帽5下测试),因为标准中根本没有定义 fflush(stdin)。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值