c语言防止缓冲区数据作为有效字符被读入
常见的防止将数据输入时存入缓冲区中的回车符读入下一个字符变量的方法是
1.用函数getchar()将回车符先读入,防止成为下一个字符型变量的有效字符。
2.在%c前面加一个空格,忽略前面数据输入时存入缓冲区中的回车符,避免被后面的字符型变量当成有效字符读入。
1 int main(){ 2 int a; 3 char b; 4 printf("Please input an integer:"); 5 scanf("%d",&a); 6 printf("intnger:%d",a); 7 getchar();//将存于缓冲区中的回车符读入,避免在后面作为有效字符读入 8 printf("Please input a char:"); 9 scanf("%c",&c); 10 //或者使用scanf(" %c",&c);效果与getchar()一样 11 printf("char=%c\n",c); 12 }
当我们需要连续从键盘键入两个字符型数组的时候,为了防止缓冲区溢出,我们使用了安全函数 char *fgets(char *s,int n,stdin)。但是出现问题。
下面的代码就是初始代码,
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 int main(int argc,char *argv[]){ 6 7 8 char str[10]; 9 char str2[10]; 10 char c; 11 printf("请输入str:"); 12 fgets(str,10,stdin); 13 14 printf("请输入str2:"); 15 fgets(str2,10,stdin); 16 17 18 printf("str=%s\n",str); 19 printf("str2=%s\n",str2); 20 21 22 23 return 0;
运行之后发现
结果: 请输入str:abcdefghjklmn 请输入str2:str=abcdefghj str2=klmn
然而这并不是我们所需要的结果,str2数组将缓冲区中str没有读完的数据当成有效字符读入了,这就让我们无法键入str2的值,因此为了解决这个问题。让我们能够正常键入第二个变量。于是有了改进版:
1 #include<stdio.h> 2 #define N 10 3 int main(int argc,char *argv[]){ 4 5 6 char str[N]; 7 char str2[N]; 8 char c; 9 printf("请输入str:"); 10 fgets(str,10,stdin); 11 12 while((c=getchar())!='\n'&&c!=EOF); //清空输出流 13 clearerr(stdin);// 清楚流的错误标记 14 15 printf("请输入str2:"); 16 fgets(str2,10,stdin); 17 18 19 printf("str=%s\n",str); 20 printf("str2=%s\n",str2); 21 22 23 return 0; 24 }
运行结果
请输入str:abcdefghijklmn 请输入str2:abcdefghijklmn str=abcdefghi str2=abcdefghi