#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { //scanf循环读取 int i; while (scanf("%d", &i)) { printf("i=%d\n", i); } return 0; }
上面代码运行结果如图:
但是我们会发现只用while的时候在黑窗口不知道怎样让程序停止
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { //scanf循环读取 //scanf()的返回值是成功赋值的变量数量,发生错误时返回EOF //直接在代码输入EOF,ctrl+左键可以查看EOF的值为-1 //什么情况下scanf会出错?-->三次行首输入ctrl,z回车 int i; while (scanf("%d", &i)!=EOF) { printf("i=%d\n", i); } return 0; }
三次行首输入ctrl,z回车,运行结果如下:
还是上面的代码,如果我们第一次在控制台输入10,点回车,控制台会打印i=10,接着我们输入a,会看到控制台会不停的打印i=10,如图所示:
解释如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { //清空缓冲区 VS2012用fflush(stdin) //stdin是标准输入 //VS2013-VS2019清空标准输入缓冲区用rewind int i,ret; while (rewind(stdin),(ret = scanf("%d", &i))!=EOF) { printf("i=%d\n", i); } return 0; }
清空缓冲区之后就不会疯狂打印了,运行截图:
用三次行首ctrl,z回车结束scanf
scanf混合输入数据
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { //scanf多种数据的混合输入,混合输入时每次在%c之前加入一个空格 //一个scanf读三种不同类型的数据 int i; char c; float f; scanf("%d %c%f", &i, &c, &f); printf("i=%d,c=%c,f=%f\n", i, c, f); return 0; }
![]()
由上述浮点数输出结果可看出默认保留了6位小数,看起来不太美观,可以加入如下图所示代码,让输出结果美观一点,代码如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { //scanf多种数据的混合输入,混合输入时每次在%c之前加入一个空格 //一个scanf读三种不同类型的数据 int i; char c; float f; scanf("%d %c%f", &i, &c, &f); printf("i=%d,c=%c,f=%4.1f\n", i, c, f); return 0; }
运行结果:
f=%4.1f代表删除的浮点数占4个空格的位置(加上小数点),1代表小数点后显示1位