1.scanf函数
1.1scanf函数介绍
scanf函数:从标准输入流中读取数据,输入到指定位置的参数中去。标准输入流就是键盘。
scanf:通过键盘给程序中的变量赋值。
参数:..... 可变参数,参数的个数是可变的。
返回值类型为整型:
1. 正整数,表示正确输入参数的个数,读取成功返回读取成功参数的个数。
例如执行 scanf(“%d %d”, &a, &b)。
输入6 6,则正确返回2(输入了两个变量)。
输入3 ;4,则可以正确输入a,无法输入b,即正确返回1(输入了一个变量)
2.“0”
表示用户输入不匹配,无法正确输入任何值.(比如上例输入“ a6 6”)
3.EOF
这是在 stdio.h 里面定义的常量,意思是end of file (文件结束标志)(通常值为-1),表示输入流已经结束。
1.2scanf函数用法
1.2.1 常规正确用法
scanf(“输入格式控制符”,要输入到指定变量的地址);
在通常情况下,我们不希望某个值是由我们程序员指定的,而是在程序运行中由用户从键盘输入的,这更能满足在日常使用时用户的需要,提高我们程序的灵活性
nt main()
{
int a= 0;;
printf("请输入一个数:\n");
scanf("%d", a);
return 0;
}
数组名就是首元素的地址,如果是一般变量则需要在其前面加上&(取地址符)
注意我们需要对scanf函数理解的两个点:
(1)我们从键盘输入的全部都是字符。比如从键盘输入 125,它表示的并不是数字 125,而是字符 ‘1’、字符 ‘2’ 和字符 ‘5’。
操作系统在接收键盘数据时会将它当成字符来接收。这时就需要用“输入控制符”把它转化成相应的内容(如%d 是有符号十进制数 %s是字符串)。
上面代码中的%d就是要将从键盘输入的这些合法的字符转化成对应的十进制数字。比如经过 %d 转化之后,字符 125 就是数字 125 了。
(2)&是一个取地址运算符,&加变量名表示“该变量的地址”,所以&n就表示变量 n 的地址。又称为“取地址n”,相当于将数据存入以变量 n 的地址为地址的变量中(即存入变量n的地址中)。也就是把转化后的数字125放到变量 n 中
总的来说
scanf 语句的意思就是:从键盘上输入字符 125,然后%d将这三个字符转化成十进制数 125,“&n” 找到变量 n 的地址,把数字 125 放到以变量 n 的地址为地址的变量中,即变量 i 中,所以最终的输出结果就是n=125。
1.2.2 注意在scanf中,所有的“非输入控制符”都要原样输入
比如:
- 这种输入方法必须满足原样输入,当用户使用时,但凡输入的和你设置的格式有一点不同都不行,哪怕只是多或者少了一个空格或者符号都是错误的,所以不建议这种写法,可以向1.2.1上面的写法一样,用printf函数进行提示,是比较好的推荐。
1.2.3 多个变量赋值
通过键盘给多个变量赋值与给一个变量赋值其实是一样的。比如给两个变量赋值就写两个 %d,然后“输入参数”中对应写上两个 “取地址变量” ;给三个变量赋值就写三个 %d,然后“输入参数”中对应写上三个 “取地址变量”
从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分给不同变量赋的值。而且空格、回车或 Tab 键的数量不限。一般使用一个空格即可。
# include <stdio.h>
int main(void)
{
int m, n;
scanf("%d%d", &m, &n);
printf("m = %d, n = %d\n", m, n);
return 0;
}
1.2.4 利用scanf返回值实现多组输入
1. 正整数,表示正确输入参数的个数,读取成功返回读取成功参数的个数。
例如执行 scanf(“%d %d”, &a, &b)。
输入6 6,则正确返回2(输入了两个变量)。
输入3 ;4,则可以正确输入a,无法输入b,即正确返回1(输入了一个变量)
当正确读到两个整型,就可以执行循环,实现两个数相乘。当读到的参数格式不对,或者读取参数为1时,不进入循环。
但是使用整数返回值实现多组输入的时候几个问题值得一提。
2.EOF
这是在 stdio.h 里面定义的常量,意思是end of file (文件结束标志)(通常值为-1),表示输入流已经结束。这个放在1.3中讲解。
1.3,补充讲解scanf的读取规则
1.4 补充scanf函数的格式控制符
%d整数(十进制打印整数)
%o整数(八进制)
%x整数(十六进制)
%f小数(单精度)
%lf小数(双精度)
2.getchar()函数
2.1 getchar函数介绍
函数作用:从缓冲区读取一个字符
返回值:int类型
读取成功,返回字符的ACSII码值
读取失败,返回EOF (end of file 文件结束的标志 -1)
因为getchar每次只读取一个字符,所以,只打印a,如果要都打印要使用循环。
这里也可以看出get插入是会读取空格和回车的。
2.2两个输入函数的经典问题代码。
我们来看下面一段代码,我们想实现输入密码,然后输入‘Y’表示确认密码成功,否则就确认失败。
int main()
{
char password[20] = { 0 };
printf("请输入,密码:\n");
scanf("%s", password);
printf("请确认密码,输入Y确定,输入N表示失败:\n");
char input = 0;
scanf("%c", &input);//scanf是从输入缓冲区里面拿数据,当缓冲区里面有数据就直接拿出,此时缓冲区有一个反斜杠n,scanf只读取到\n之前
//input = getchar();
if (input == 'Y')
{
printf("密码确认成功\n");
}
else
{
printf("密码确认失败\n");
}
return 0;
}
但是,当我们运行发现我们都还没有输入Y或者N来进行确定或者否定,系统直接自己就进行否定了这是为什么呢。这里就可以再看看两个函数的读取规则。
然后我们可以分析代码
如何解决呢?
我们知道错误原因就是因为缓冲区里面还有一个\n,那我用一个getchar函数提取了,清楚掉缓冲区不就好了嘛,看效果。
看似解决了问题,但是又出现了新的情况,请看:
错误的原因:
scanf用%s读取的时候读取到空格就结束了,所以只从缓冲区里面拿走了123 缓冲区里面还有
abc,但是一个getchar只清除一个空格,所以a 给了input导致错误,那么getchar就需要一直执行到读到回车才是完美的解决所以:
附上源码,大家可以体验。
int main()
{
char password[20] = { 0 };
printf("请输入,密码:\n");
scanf("%s", password);
printf("请确认密码,输入Y确定,输入N表示失败:\n");
char input = 0;
while (getchar() != '\n')
{
;//空语句
}
scanf("%c", &input);//scanf是从输入缓冲区里面拿数据,当缓冲区里面有数据就直接拿出,此时缓冲区有一个反斜杠n,scanf只读取到\n之前
//input = getchar();
if (input == 'Y')
{
printf("密码确认成功\n");
}
else
{
printf("密码确认失败\n");
}
return 0;
}
以上就是本期所有内容,后续随着学习的深入,我会对博客的不足进行补充,也欢迎大家批评指正。