前言:(本文所用测试全在vs2019)
本文主要是对
scanf函数输入中所需注意的形式,以及不同的格式下对于scanf函数输入的影响。
scanf中基本原理的讲解,理解实现scanf函数的内部逻辑。
(一)scanf函数的输入形式及基本原理解析
1 scanf函数的标准引用
#include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
return 0;
}
int scanf(const char*format,…);
- &()
对于运用scanf之前,首先得定义一变量,如上述中的变量 n ,是否初始化都是可以的。
这样做的原因是对于scanf函数来说,是用于 标准输入流(stdin) 输入到内存中,
及从键盘上输入后到内存中。而我们要输入到内存的哪里,这就是 & 的使用。
变量在初始化时,在内存开辟空间,而 &() 取出括号里变量的地址,scanf以此把输入的
值放到取出的变量的空间里,来改变变量原有的值 。
//值得注意的是,不是用scanf函数中都要做出 & ,我们只是取出地址来输入,如若本身代表着
地址,则直接写上变量即可 当然,用上也不会报错,如
#include<stdio.h>
int main()
{
int age = 0;;
int* p = &age;
char name[3] = {
'a','b','c'};
scanf("%d", p);
scanf("%c", name);//数组名代表数组首元素地址
return 0;
}
- ” %”
%d,%c等在scanf里称为 “输入控制符” ,首先我们得知道的是:我们从键盘输入的全部都是字符。
如scanf(“%d”,…)
运行以后,程序会让我们从 标准输入流 上输入内容(即从键盘上输入),此时如若我们输入
123,它代表着:字符1、字符2、字符3,此时它们经过 输入控制符 相应的转化一下
(因为我们想输入的是整数), 转化成十进制数123,存入 输入缓冲区 中(注:空格、回车
或tab等都会进入缓冲区),当按下 回车 键的时候,scanf开始进入缓冲区取数据(从前往后取)
这时%()的作用就是以什么样的方式取数据。
scanf 中 %d 只识别“十进制整数” 。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。当 scanf 进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,那么它并不取用,而 是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。而未被跳过或未被取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。
但是如果 %d 下输入遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。
如以下代码
#include<stdio.h>
int main()
{
int i=0;
scanf("%d", &i);
printf("i=%d\n", i);
return 0;
}
出现下面的效果,因为直接跳出,什么都没取到给 i , i 为原本的值0。
或者把 i 不初始化
# include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}
出现下面的效果,局部变量 i 未初始化,又没取到,出现随机值。
注:不可以理解为输入字符a,不是数字字符,无法通过%d转化成十进制的数字,而出现以上结果,它是%d遇字母就直接跳出
看一下代码:
#include<stdio.h>
int main()
{
int i;
int m;
scanf("%d%d", &i,&m);
printf("i=%d\n", i);
printf("m=%d\n", m);
return 0;
}
如若我们第一次输入字母,第二次输入数字,出现以下结果
直接跳出读取,不看接下来的缓冲区后面。
(二)scanf的输入格式解析
首先我们知道的是,scanf函数里,有双引号” “内的 “输入控制符” ,以及 “输入参数” 。
如
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
return 0;
}
“输入控制符” 为 %d, “输入参数” 为 &n。
我们需要注意的是:
1)参数相对应
“输入控制符”,“输入参数” 无论在 “顺序” 上还是在 “个数” 上一定要一一对应 。
有几个我就写入几个,比如给两个变量一起输入,两个变量之间用逗号分隔。
#include<stdio.h>
int main()
{
int n;
int m;
scanf("%d%d", &n,&m);//两个输入控制符,对应两个参数
return 0;
}
2)双引号下不同格式的输入
双引号内部如若不止”输入控制符”,则输入时进行一一对应。
介绍前,先讲一下分隔符
- 分隔符
首先当我们要用scanf函数对 多个变量 进行输入时,除了在写scanf函数时 “输入参数”
部分用逗号分隔开时,还得在运行代码从键盘输入的时候用 分隔符区分输入的值
如以下,当我们对两整形变量输入值时
我们再输入的时候,为区分两个值,就用分隔符来区分。
常见的分隔符有:
空格 、回车、Tab键 - 一一对应
scanf函数与printf函数在 双引号内部 有着相同的逻辑,一一对应。printf是一一对应打印,
scanf是一一对应输入。
如
#include<stdio.h>
int main()
{
int n;
scanf("n=%d", &n);
printf("%d", n);
return 0;
}
这时运行代码后,进入输入,必须对应输入双引号下,不然报错
正确对应输入后,取到我们想输入的值
不正确对应输入后,取不到我们想输入的值,如直接输入我们想要的10
什么也没取到,局部变量 n 未初始化,随机值。
又如
int main()
{
int n;
scanf("20=%d", &n);
printf("%d", n);
return 0;
}
一样的道理,无论是何种形式。
小结:
1)scanf函数 输入控制符 对输入的运用不同, 输入参数 为地址。
2)scanf函数中输入控制符%d,遇字母直接跳出缓冲区。
2)scanf函数的 双引号” “ 下的内容,在从键盘上输入时要 采取一一对应 输入。
(三)未理解的问题
在上述(二)中,介绍了一一对应的原则,但本人有不理解的问题。
- scanf(“n=%d”,&n)中,从键盘输入n=10时,n=有没有放入缓冲区?
#include<stdio.h>
int main()
{
int n;
scanf("20=%d", &n);
printf("%d", n);
return 0;
}
从以上代码来看的话,如果20=放入缓冲区,那根据scanf的取数据逻辑是怎么不取走20的?应当是没有放入缓冲区里的?//不确定
- scanf中对于双引号内的空格常采用不一一对应?
如
#include<stdio.h>
int main()
{
int n;
scanf("20 %d", &n);
printf("%d", n);
return 0;
}
20(空格)%d 在输入时加不加空格都没有任何影响,我输入2010都能取到10给n。
难道全读入缓冲区,20因为双引号下的存在读不了,空格跳过,读取10?
//因为一些原因,上述问题没有彻底理解解决,待解决后,对内容进行修改。
如若文中有任何不严谨的地方,请及时留言,我加以学习改正。
本人参考部分资料来源于此篇,这篇文章对我写此篇有启发,详细可点开看看
(scanf函数完全攻略)
这是我写的第一篇博客,如若有小白有写博客想法,可以看我参考的下面的文章
小白如何写好自己的一篇博客
这篇文章有用到让百度能搜到我的文章,有意愿点开详细查看,在最后
CSDN博客新手使用方案
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35919.html