#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
printf("i=%d\n", i);
return 0;
}
此时运行时只能运行一次
![](https://img-blog.csdnimg.cn/img_convert/4ccc96229ff71e206a9315a7afe625cb.png)
如果我们想要不断地输入要怎么办呢?
scanf()的返回值是成功赋值的变量数量,发生错误时返回EOF。
Q1:什么是EOF?
直接在代码里输入EOF,然后按住ctrl键并鼠标左键点击
![](https://img-blog.csdnimg.cn/img_convert/3e980f33665379e6d5045fa020eb1de7.png)
![](https://img-blog.csdnimg.cn/img_convert/9b2263b03340219d79a169b36dae1810.png)
自动跳转到stdio.h
在C语言中,EOF(end of file)用来表示文件结束。它是stdio.h里面定义的一个宏,EOF值为-1。
![](https://img-blog.csdnimg.cn/img_convert/637062d5a6a09449418c1cd7ecd297e0.png)
!=为不等于
Q2:什么情况下scanf会出错?
在行首输入ctrl+z
在行首输入ctrl+z
在行首输入ctrl+z
注:mac电脑结束循环输入时用ctrl+d
![](https://img-blog.csdnimg.cn/img_convert/09f65a898a59417089b9cd1055618da5.png)
Q3:什么情况会疯狂打印?
![](https://img-blog.csdnimg.cn/img_convert/c6563e5566fc2f8bcfebf04e3debc7e4.png)
输入10时正常打印,输入a后即会如下图疯狂打印
![](https://img-blog.csdnimg.cn/img_convert/6a24720d3a03c175a8064c96badddac4.png)
当我们不提前输入一个10而是直接输入a时会出现如下情况
![](https://img-blog.csdnimg.cn/img_convert/71480c14ae8c585aac6b2ffb648ebd55.png)
这是因为在C语言中,编译时系统会先给变量赋予默认值,其中,当定义一个int型变量时,系统会自动给该int型变量赋值于-858993460
所以为什么会疯狂打印呢
比如一开始输入10时,缓冲区内是“10\n”,%d读取了10,留下了\n,而%d可以忽略空格和\n,所以继续输入数字时可以继续读取,而一旦输入了a,此时%d与a并不能匹配,所以此时scanf成功赋值的变量数量为0,又因为0!=-1,所以会无限循环下去。
Q4:如果有时候手抖输入了不是数字的字符呢,应该用什么方法避免出现疯狂打印?
使用rewind清空标准输入缓冲区
注:rewind只有微软可以用,mac不可以
stdin是标准输入
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i,ret;
while(rewind(stdin),(ret=scanf("%d", &i))!=EOF)//while是实现循环,没跟分号
//stdin是标准输入
{
printf("i=%d\n", i);
}
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/0f9c8f8e9932eb89db8dff1090cd6def.png)
![](https://img-blog.csdnimg.cn/img_convert/0852bdce56e39db1f4081b807e22188e.png)
利用scanf循环读取,我们可以完成将小写字符串转换为大写字符串的任务
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char c;
while (scanf("%c", &c) != EOF)
{
if (c != '\n')
{
printf("%c", c - 32);
}
else
{
printf("\n");
}
}
return 0;
}
![](https://img-blog.csdnimg.cn/img_convert/8afd1b1d28396a8583408ba36304766c.png)
scanf的混合输入时,注意在%c之前加上一个空格即可
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i;
char c;
float f;
scanf("%d %c%f", &i, &c, &f);
//混合输入时注意每次在%c之前加一个空格
print("i=%d,c=%c,f=%f\n", i, c, f);
return 0;
}