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):函数返回1,2...,
** 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);
}
}