检测scanf()输入的合法性,清除stdin缓冲区的方法[C语言]

#include <stdio.h>
#include <stdlib.h>
#define SIZE 30
#define N 10
typedef struct{
    char name[30];
    char no[15];
    int sc[3];
    float aver;
}STU;
void input_info(STU *stu,int n){
    for (int i=0;i<n;i++){
        printf("请输入第%d个学生的信息:",i+1);
        fscanf(stdin,"%s %s %d %d %d",stu[i].name,stu[i].no,&stu[i].sc[0],&stu[i].sc[1],&stu[i].sc[2]);
        stu[i].aver = (stu[i].sc[0]+stu[i].sc[1]+stu[i].sc[2])/3.0;
    }  
}
void write_info(STU *stu,FILE *fp){
    if (NULL == fp) {
        printf ("Failed to open the file !\n");
        exit(0);
    }
    fwrite(stu,sizeof(stu),1,fp);
}
void read_info(STU *stu,FILE *fp,int n){
    if (NULL == fp) {
        printf ("Failed to open the file !\n");
        exit(0);
    }
    rewind(fp);
    fread(stu,sizeof(stu),1,fp);
    for (int i=0;i<n;i++){
        fprintf(stdout,"%s: %s %d %d %d %.2f\n",stu[i].name,stu[i].no,stu[i].sc[0],stu[i].sc[1],stu[i].sc[2],stu[i].aver);
    } 
}
int main(){
    FILE *fp = fopen("info.dat","rb+");
    STU stu[N];
    int n;
    printf("请输入学生的人数:");
    /*检测scanf输入的合法性*/
    while(1){               
        if (scanf("%d",&n) == 1) 
            break;
        /*清除stdin缓存流*/

        // /*(全平台适用)简单明了效率高*/
        scanf("%*[^\n]%*c");//从stdin输入流取出字符直接丢弃        

        // /*(全平台适用)从stdin输入流取出字符,流是queue结构,最后读到\n*/
        // char ch;
        // while(ch = getchar()!='\n' && ch != EOF);   
     
        // /*windows适用*/
        // fflush(stdin);/*直接清空stdin流*/

        // /*不太好用*/
        // setbuf(stdin, NULL); 
        printf("输入错误啦!!!你娘个腿儿的!!!\n");           
    }    
    input_info(stu,n);
    write_info(stu,fp);
    read_info(stu,fp,n);       
    fclose(fp);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值