scanf函数中输入格式及输入基本原理讲解

scanf函数中输入格式及输入基本原理讲解#include<stdio.h>intmain(){return0;}

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

  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博客新手使用方案

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/35919.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注