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

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

#include"stdio.h"
int main()
{
int n =10;
char a[10];
int i =0;
for(;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{
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)。

你可能感兴趣的:(编程相关,编译器,gcc,ini,c,linux,测试)