前言:(本文所用测试全在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,…);

  1. &()
    对于运用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;
}
  1. " %"
    %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)双引号下不同格式的输入

双引号内部如若不止"输入控制符",则输入时进行一一对应。
介绍前,先讲一下分隔符

  1. 分隔符
    首先当我们要用scanf函数对 多个变量 进行输入时,除了在写scanf函数时 "输入参数"
    部分用逗号分隔开时,还得在运行代码从键盘输入的时候用 分隔符区分输入的值
    如以下,当我们对两整形变量输入值时

    我们再输入的时候,为区分两个值,就用分隔符来区分。
    常见的分隔符有:
    空格回车Tab键
  2. 一一对应
    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函数的 双引号" " 下的内容,在从键盘上输入时要 采取一一对应 输入。

(三)未理解的问题

在上述(二)中,介绍了一一对应的原则,但本人有不理解的问题。

  1. 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的?应当是没有放入缓冲区里的?//不确定

  1. 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函数中输入格式及输入基本原理讲解相关推荐

  1. [C语言] scanf 函数详解多组输入法和gitee 自荐

    自荐 gitee>>> C语言学习练习: C语言学习练习 上面是我的gitee C语言仓库链接,欢迎大家来看看我写的代码.!(◦˘ ³(♡ŐωŐ♡)(给大家推荐gitee(码云)这个 ...

  2. 本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。输入格式:输入在一行中给出一个长整型范围内的非负整数。输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格

    本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字.输入格式:输入在一行中给出一个长整型范围内的非负整数.输出格式:从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格 1 ...

  3. 实验4.1对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 。 要求: 1)数组有10个元素; 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息; 3)输出时,首先输出数组

    /*SY4.1 题目描述 对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 . 要求: 1)数组有10个元素: 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息: 3)输出 ...

  4. R7-3 统计满足特定条件的字符数​输入字符串A(没有重复字符),输入字符串B,求在字符串A中字符的个数,这些字符必须同时又在字符串B中。提示:用in运算符。输入格式:一行输入字符串A。一行

    输入字符串A(没有重复字符),输入字符串B,求在字符串A中字符的个数,这些字符必须同时又在字符串B中.提示:用in运算符. 输入格式: 一行输入字符串A. 一行输入字符串B. 输出格式: 一行输出字符 ...

  5. C语言正确的输入格式和输入方式

    1-1 C 语言表达式的正确书写方法 C 表达式是由 C 语言的常量.变量和运算符组成,它的书写格式与数学表达式有较大 不同 ,例如: 1 )数学表达式为: z=2xyz , C 语言表达式则为: z ...

  6. 为什么scanf 函数中不能加\n

    当代码是scanf("%d\n",&a);时 如果你输入数字后一直按回车,scanf就会一直阻塞在那里,直到你再一次输入. 而且运行结果只会识别第一个数,不会识别第二个数. ...

  7. C语言中scanf()函数中的是什么

    困惑初学者的C语言中scanf()函数中的&到底是什么 对于初学者而言,肯定有过这样一个困惑:为什么在使用scanf函数输入数据时有时需要在参数前加一个&,而有时却不用. 在回答&qu ...

  8. 4、题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出。 * * 输入格式:测试输入包含若干测试用例,每个测试用例的格式为 第1行:N 第2行:N名学生的成绩,相邻两数字用一个

    题目: /* 4.题目要求:读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式:测试输入包含若干测试用例,每个测试用例的格式为   第1行:N   第2行:N名学生的成绩,相邻两数字用一 ...

  9. C/C++ scanf 函数中%s 和%c 的简单差别

    首先声明:在键盘中敲入字符后,字符会首先保存在键盘缓冲区中供scanf函数读取(scanf.getchar等函数是读取缓冲区,getch函数是读取的控制台信息,即为直接从键盘读取).另外特别注意键盘上 ...

最新文章

  1. 硬盘满了 mysql启不来_MySQL数据库之磁盘已满造成的mysql启动失败问题分享
  2. ubuntu通过pem连接服务器
  3. F110报错:Company codes **/** do not appear in proposal ***; correct
  4. ceph集群简单安装部署(Ubuntu14环境)
  5. 用c语言设计一个任意20个数升序排列,编写一个用选择法对一维数组升序排序的函数,并在主函数中调用该排序函数,实现对任意20个整数的排序。...
  6. == 捕获对象时的模式切换 ==
  7. SpringMVC4零配置--web.xml
  8. .NET 和 Mono 的一点历史
  9. 漫步最优化十三——驻点
  10. SQLi LABS Less-26 联合注入+报错注入+布尔盲注+时间盲注
  11. 穿越剧_零差评的5部穿越剧,少有的巅峰之作,第一堪称穿越鼻祖!
  12. [linux]linux IO 5种方式
  13. 邮箱如何发邮件?邮箱怎么发邮件,掌握这几点,轻松搞定
  14. 程序员投入时间和精力实现财富增长之道,这可能会伴随你程序员整个生涯(请不要连续点赞)
  15. (光滑样条)Smoothing spline的数学推导
  16. 判断一个数是否为四叶玫瑰数
  17. Cadence(virtuoso)集成电路设计软件基本操作——库管理
  18. FFmpeg屏幕录制
  19. 闲聊调度系统 Apache Airflow
  20. bit和byte以及千字节关系

热门文章

  1. 【181130】VC++ 模拟地球太阳月亮运动的过程源代码
  2. Python遇见机器学习 ---- 逻辑回归 Logistic Regression
  3. 单个页面多个按钮调用同一个弹窗,和滚屏展示效果,关闭后,5秒自动弹出滚屏展示!
  4. DOS界面下的翻译软件制作
  5. ECharts设置grid组件在容器中的位置
  6. 基于 IJKPlayer-concat 协议的视频无缝拼接技术实现
  7. Android自定义键盘的几个小点
  8. 数据库查询和数据操纵
  9. 中国黑客简史与网络攻防大揭秘
  10. Ubuntu oh-my-zsh与autosuggestions配置