scanf函数解析,附带rewind函数(清空缓存)

scanf函数:int scanf(const char * __restrict, …) __scanflike(1, 2);

参考资料:小话c语言(3)—-scanf函数,想说输入不容易!

//
//  main.c
//  ScanfDemo
//
//  Created by eliot on 2017/3/23.
//  Copyright © 2017年 HUOHUO. All rights reserved.
//

/*
 ** scanf函数返回值测试
 ** rewind函数,清空缓存
 */

#include <stdio.h>

int main(int argc, const char * argv[]) {
    // insert code here...
    void testScanfReturnValue();
    testScanfReturnValue();
    return 0;
}

/*
 ** 测试scanf函数的返回值
 ** int  scanf(const char * __restrict, ...) __scanflike(1, 2);
 ** __restrict:是C99标准引入的,它只可以用于限定指针,并表明该指针是访问一个数据对象的唯一且初始的方式,这样编译器就可以做一些特定的优化
 ** __scanflike(1, 2):函数返回12...,
 ** int ret = scanf("%d",&i);   // 如果输入成功则ret = 1;
 ** int ret1 = scanf("%d %d",&a,&b); // 如果输入成功则ret1 = 2;如果只有一个输入正确,ret1 = 1
 ** scanf函数返回值代表输入正确的个数,分析需要输入的变量到底有没有被正确输入。
 ** 如果scanf输入了不正确的数据格式,想接着再次输入时,就不能输入了。
 ** scanf有一个输入缓冲区,调用scanf,scanf就会从它的输入缓冲区中来获取对应的数据,如果获取到就会传入再继续执行,否则就会等待输入。
 ** scanf("%d",&i);要求输入的值为整型,如果输入的是字符d,则不匹配,但是scanf的输入缓存区会保留字符d,下次调用scanf的时候,先从缓冲区拿到了字符d
 ** 当输入类型不匹配时,可以用rewind(stdin);清除缓存
 */
void testScanfReturnValue() {
    int i;
    printf("Please input i value : \n");
    int ret = scanf("%d",&i);
    if (ret == 1) {
        printf("i = %d\n",i);
    }
    else {
        printf("输入i值有误\n");
        printf("ret = %d\n",ret);
        /*
         ** 输入类型有误,清空缓存
         */
        rewind(stdin);
    }

    int a, b;
    printf("Please input a, b value : \n");
    int ret1 = scanf("%d %d",&a,&b);
    if (ret1 == 2) {
        printf("a = %d , b = %d",a,b);
    }
    else {
        printf("输入a, b值有误\n");
        printf("ret1 = %d\n",ret1);
        rewind(stdin);
    }

    int c, d, e, f;
    printf("Please input c, d, e, f value : \n");
    int ret2 = scanf("%d %d %d %d",&c,&d,&e,&f);
    if (ret2 == 4) {
        printf("c = %d , d = %d , e = %d , f = %d\n",c,d,e,f);
    }
    else {
        printf("输入c, d, e, f值有误\n");
        printf("ret2 = %d\n",ret2);
        rewind(stdin);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值