c语言防止缓冲区数据作为有效字符被读入

常见的防止将数据输入时存入缓冲区中的回车符读入下一个字符变量的方法是
1.用函数getchar()将回车符先读入,防止成为下一个字符型变量的有效字符。
2.在%c前面加一个空格,忽略前面数据输入时存入缓冲区中的回车符,避免被后面的字符型变量当成有效字符读入。
int main(){
    int a;
    char b;
    printf("Please input an integer:");
    scanf("%d",&a);
    printf("intnger:%d",a);
    getchar();//将存于缓冲区中的回车符读入,避免在后面作为有效字符读入
    printf("Please input a char:");
    scanf("%c",&c);
    //或者使用scanf(" %c",&c);效果与getchar()一样
    printf("char=%c\n",c);
}
 当我们需要连续从键盘键入两个字符型数组的时候,为了防止缓冲区溢出,我们使用了安全函数 char *fgets(char *s,int n,stdin)。但是出现问题。
 下面的代码就是初始代码,
#include<stdio.h>
#include<stdlib.h>


int main(int argc,char *argv[]){


    char str[10];
    char str2[10];
    char c;
    printf("请输入str:");
    fgets(str,10,stdin);

    printf("请输入str2:");
    fgets(str2,10,stdin);


    printf("str=%s\n",str);
    printf("str2=%s\n",str2);


    return 0;

运行之后发现

结果:
请输入str:abcdefghjklmn
请输入str2:str=abcdefghj
str2=klmn
 然而这并不是我们所需要的结果,str2数组将缓冲区中str没有读完的数据当成有效字符读入了,这就让我们无法键入str2的值,因此为了解决这个问题。让我们能够正常键入第二个变量。于是有了改进版:
#include<stdio.h>
#define N 10
int main(int argc,char *argv[]){


    char str[N];
    char str2[N];
    char c;
    printf("请输入str:");
    fgets(str,10,stdin);

    while((c=getchar())!='\n'&&c!=EOF); //清空输出流
    clearerr(stdin);//  清楚流的错误标记

    printf("请输入str2:");
    fgets(str2,10,stdin);


    printf("str=%s\n",str);
    printf("str2=%s\n",str2);


    return 0;
}

运行结果

请输入str:abcdefghijklmn
请输入str2:abcdefghijklmn
str=abcdefghi
str2=abcdefghi

转载于:https://www.cnblogs.com/cmustard/p/6769950.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值