scanf函数中输入格式及输入基本原理讲解
前言:(本文所用测试全在vs2019)
本文主要是对
scanf函数输入中所需注意的形式,以及不同的格式下对于scanf函数输入的影响。
scanf中基本原理的讲解,理解实现scanf函数的内部逻辑。
文章目录
- (一)scanf函数的输入形式及基本原理解析
- 1 scanf函数的标准引用
- (二)scanf的输入格式解析
- 1)参数相对应
- 2)双引号下不同格式的输入
- (三)未理解的问题
(一)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博客新手使用方案
scanf函数中输入格式及输入基本原理讲解相关推荐
- [C语言] scanf 函数详解多组输入法和gitee 自荐
自荐 gitee>>> C语言学习练习: C语言学习练习 上面是我的gitee C语言仓库链接,欢迎大家来看看我写的代码.!(◦˘ ³(♡ŐωŐ♡)(给大家推荐gitee(码云)这个 ...
- 本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。输入格式:输入在一行中给出一个长整型范围内的非负整数。输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字.输入格式:输入在一行中给出一个长整型范围内的非负整数.输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格 1 ...
- 实验4.1对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 。 要求: 1)数组有10个元素; 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息; 3)输出时,首先输出数组
/*SY4.1 题目描述 对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 . 要求: 1)数组有10个元素: 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息: 3)输出 ...
- R7-3 统计满足特定条件的字符数输入字符串A(没有重复字符),输入字符串B,求在字符串A中字符的个数,这些字符必须同时又在字符串B中。提示:用in运算符。输入格式:一行输入字符串A。一行
输入字符串A(没有重复字符),输入字符串B,求在字符串A中字符的个数,这些字符必须同时又在字符串B中.提示:用in运算符. 输入格式: 一行输入字符串A. 一行输入字符串B. 输出格式: 一行输出字符 ...
- C语言正确的输入格式和输入方式
1-1 C 语言表达式的正确书写方法 C 表达式是由 C 语言的常量.变量和运算符组成,它的书写格式与数学表达式有较大 不同 ,例如: 1 )数学表达式为: z=2xyz , C 语言表达式则为: z ...
- 为什么scanf 函数中不能加\n
当代码是scanf("%d\n",&a);时 如果你输入数字后一直按回车,scanf就会一直阻塞在那里,直到你再一次输入. 而且运行结果只会识别第一个数,不会识别第二个数. ...
- C语言中scanf()函数中的是什么
困惑初学者的C语言中scanf()函数中的&到底是什么 对于初学者而言,肯定有过这样一个困惑:为什么在使用scanf函数输入数据时有时需要在参数前加一个&,而有时却不用. 在回答&qu ...
- 4、题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出。 * * 输入格式:测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个
题目: /* 4.题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式:测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一 ...
- C/C++ scanf 函数中%s 和%c 的简单差别
首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf.getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取).另外特别注意键盘上 ...
最新文章
- 硬盘满了 mysql启不来_MySQL数据库之磁盘已满造成的mysql启动失败问题分享
- ubuntu通过pem连接服务器
- F110报错:Company codes **/** do not appear in proposal ***; correct
- ceph集群简单安装部署(Ubuntu14环境)
- 用c语言设计一个任意20个数升序排列,编写一个用选择法对一维数组升序排序的函数,并在主函数中调用该排序函数,实现对任意20个整数的排序。...
- == 捕获对象时的模式切换 ==
- SpringMVC4零配置--web.xml
- .NET 和 Mono 的一点历史
- 漫步最优化十三——驻点
- SQLi LABS Less-26 联合注入+报错注入+布尔盲注+时间盲注
- 穿越剧_零差评的5部穿越剧,少有的巅峰之作,第一堪称穿越鼻祖!
- [linux]linux IO 5种方式
- 邮箱如何发邮件?邮箱怎么发邮件,掌握这几点,轻松搞定
- 程序员投入时间和精力实现财富增长之道,这可能会伴随你程序员整个生涯(请不要连续点赞)
- (光滑样条)Smoothing spline的数学推导
- 判断一个数是否为四叶玫瑰数
- Cadence(virtuoso)集成电路设计软件基本操作——库管理
- FFmpeg屏幕录制
- 闲聊调度系统 Apache Airflow
- bit和byte以及千字节关系