scanf使用概述

故事扮演 提交于 2020-01-21 00:40:14

一、scanf使用方法:

1. scanf(“输入控制符”,输入参数);
●从键盘中输入的字符,转化为 输入控制符规定格式的数据,然后存入(以输入参数为值的)地址变量中
①VS_2015版本如果使用scanf会报错,用scanf_s不会报错
②从键盘上敲入的是数字、字母、符号……,这些数字、字母、符号全部转为字符形式的信息 传递给操作系统。
操作系统是以字符的方式接收键盘上的信息。
操作系统接受字符信息后,需要使用 “ 输入控制符 ” 将字符信息转化。
%d的含义就是要将字符信息转化成一个十进制数字。经过 %d 转化完之后,字符 “ 123 ” 就是数字 123 了。
最后通过 “ &i ” 找到变量 i 的地址,再将数字 123 存入变量 i 的地址中,所以最终的输出结果:i=123
③&:取地址符,&i:i的地址
④将从键盘中敲入的字符转化为十进制的形式,将此值存入 i 的地址中(即,将数据存入以变量 i 的地址为地址的地址变量中)

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf
	*/
	# include <stdio.h>
	int main (void)
	{
		int i;
	
		/*将用户从键盘中敲入的字符转化为十进制的形式%d,
		将此值(十进制)存入i 变量的地址中*/
		scanf("%d", &i);
		printf("i = %d\n",i);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	123
	i = 123
	------------------------
	*/

⑤变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。
在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据
在程序中给变量赋值,实际上是通过变量名找到相应的内存地址,将值赋给其存储单元中。

⑥注意,为什么不直接说 “ 存入变量i中 ”,而是说 “ 存入以变量 i 的地址为地址的地址变量中 ”?
因为这么说虽然很绕口,但是能加强对 &i 的理解,能表达 &i 的本质和内涵。很多人在学习 scanf 的时候,经常将 “变量 i ”和 “变量 i 的地址 ” 混淆,从而思维开始混乱,等深刻了解 &i 的含义之后就可以不那么说了

哈哈哈哈我已经理解了(●ˇ∀ˇ●)

2. scanf(“非输入控制符 + 输入控制符”,输入参数);
●非输入控制符需要原样输入!否则计算机软件不能识别之后的部分
●从键盘中输入的字符,转化为 输入控制符规定格式的数据,然后存入(以输入参数为值的)地址变量中
①scanf(“输入控制符非输入控制符”, 输入参数);
这种用法几乎是不用的,建议永远不要用。但是经常有人问,为什么 printf 中可以有“非输出控制符”,而 scanf 中就不可以有“非输入控制符”。事实上不是不可以有,而是没有必要!
②在 scanf 的使用中一定要记住:双引号内除了“输入控制符”之外,什么都不要加(即不要加“非输入控制符”)否则就是自找麻烦。而且对于用户而言,肯定是输入越简单越好。【看看就好】
③m%d只是一种限制,限制用户给变量赋值时(输入)必须敲m。并没有把m赋值给变量 i 。所以在输出的时候,i = 123

/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf
	*/
	# include <stdio.h>
	int main (void)
	{
		int i;
	
		/*m:非输出控制符*/
		scanf("m%d", &i);
		/*i:非输出控制符*/
		printf("i = %d\n", i);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	mn
	(×非法的输入)
	●用户输入时输入:
	123
	(×非法的输入)
	●用户输入时输入:
	m123
	(i = 123)
	●用户输入时输入:
	m123n
	(i = 123)
	------------------------
	*/

④虽然 scanf 中没有加任何“非输入控制符”,但是从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分是给不同变量赋的值。而且空格、回车或 Tab 键的数量不限,只要有就行。一般都使用一个空格。

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf
	*/
	# include <stdio.h>
	int main (void)
	{
		int i , j;
	
		scanf("%d%d", &i, &j);
		/*i:非输出控制符*/
		printf("i = %d, j = %d\n", i, j);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	1 2
	(i = 1,j = 2)
	------------------------
	*/

⑤空白字符:制表符、回车符、空格符(tap、回车、换行都算空格)

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf
	*/
	# include <stdio.h>
	int main (void)
	{
		int i , j;
	
		/*空格:非输出控制符*/
		scanf("%d %d", &i, &j);
		/*i:非输出控制符*/
		printf("i = %d, j = %d\n", i, j);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	12
	↙(回车)
	↙
	88
	(i = 12,j = 88)
	●用户输入时输入:
	1 2
	(i = 1,j = 2)
	------------------------
	*/
	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf
	*/
	# include <stdio.h>
	int main (void)
	{
		int i , j, k;
	
		/*逗号:非输出控制符——>应该原样输入,
		否则——>看最下面结果*/
		scanf("%d,%d,%d", &i, &j &k);
		/*i:非输出控制符*/
		printf("i = %d, j = %d, k = %d\n", i, j ,k);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	1 2 3
	(i = 1,j = 非法的输入,k = 非法的输入)
	------------------------
	*/

⑥在 printf 中,“输出控制符”的类型可以与数据的类型不一致;但是在 scanf 中,对于从键盘输入的数据的类型、scanf 中“输入控制符”的类型、变量所定义的类型,这三个类型一定要一致,否则就是错的。
⑦用户不能输入“A”,这是非法的输入。因为在scanf();中为了避免使用非法字符所以规定了输入的格式,明确了需要输入%d形式的字符,所以A不是合法字符。
在 scanf 中,从键盘输入的一切数据都会存入缓冲区。存储和读取按照先进先出原则。
但scanf 中 %d 只识别“十进制整数”。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。
当 scanf 进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,并不取用,跳过继续往后取后面的数据,直到取到“十进制整数”为止。
对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。
未被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。
如果 %d 遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。
所以如果输入"A",虽然 scanf 进入缓冲区了,但用户输入的是字母 A,什么都没取到就出来了,而变量没有值,即未初始化,所以输出就是 –858993460。
但如果将 %d 换成 %c,那么任何数据都会被当作一个字符,不管是数字还是空格、回车、Tab 键它都会取回。
从键盘输入 123,这个不是数字 123,而是字符 ‘1’、字符 ‘2’ 和字符 ‘3’,它们依次排列在缓冲区中。因为每个字符变量 char 只能放一个字符。所以输入“123”之后按回车,scanf 开始进入缓冲区,按照次序,先取字符 ‘1’,如果还要取就再取字符 ‘2’,以此类推。

二、scanf和高质量代码的关系:

1. 使用scanf之前先使用printf来提示用户以什么样方式输入
①这里的原样输入需要注意,如果printf();中说明输入值需要让用户使用逗号分隔开,要观察scanf();中的非输出控制符“逗号”是英文形式【,】还是中文形式【,】
用户输入的逗号需要与scanf();里的逗号形式一致!
★☆★所以在使用scanf中尽量不使用逗号分隔数值,就不用叫用户使用逗号了★☆★

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf编写出高质量代码
	*/
	# include <stdio.h>
	int main (void)
	{
		int i , j, k;
		/*这里的原样输入需要注意,如果printf();
		中说明输入值需要让用户使用逗号分隔开,
		要观察scanf();中的非输出控制符“逗号”是
		英文形式【,】还是中文形式【,】
		用户输入的逗号需要与scanf();里的逗号形式一致!
		所以在使用scanf中尽量不使用逗号分割数值*/
		printf("请输入三个值,中间以逗号分隔开:");
		/*逗号:非输出控制符——>应该原样输入,
		否则——>看最下面结果*/
		scanf("%d,%d,%d", &i, &j &k);
		/*i:非输出控制符*/
		printf("i = %d, j = %d, k = %d\n", i, j ,k);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	1,2,3【与scanf();中的逗号形式相同,这里是英文形式】
	(i = 1,j = 2,k = 3)
	●用户输入时输入:
	1,2,3【与scanf();中的逗号形式不同,这里是中文形式】
	(i = 1,j = 非法的输入,k = 非法的输入)
	------------------------
	*/

2. scanf中尽量不使用非输入控制符,特别是\n

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf编写出高质量代码
	*/
	# include <stdio.h>
	int main (void)
	{
		int i , j, k;
	
		/*\n:非输出控制符——>应该原样输入,
		否则——>看最下面结果*/
		scanf("%d\n", &i);
		/*i:非输出控制符*/
		printf("i = %d\n", i);
	
		return 0 ;
	}
	/*
	在VS_2013中输出结果是:
	------------------------
	●用户输入时输入:
	123
	↙(回车)
	↙
	↙
	……
	(一直回车没有反映和显示,因为\n是非输出控制符,
	需要用户原样输入)
	●用户输入时输入:
	123
	\n
	(i = 1,j = 非法的输入,k = 非法的输入)
	------------------------
	*/

3. 应该编写代码对用户的非法输入做处理:
①输入的数据123m首先都保存在键盘缓冲区中,给 i 赋值时,读取数据123m,在读到m发现不是数字,终止读取
但m仍然在键盘缓冲区中没有被消除,计算机给下一个变量 j 赋值时,就直接由m开始。
又因为 j 是 int型变量,计算机发现读取的m不是数字,就无法给 j 赋正确的值,所以产生报错,输出垃圾数据。
如果 j 定义为char类型变量,就可以输出字符m
②在scanf 是缓冲输入的(从键盘输入的数据都会先存放在内存中的一个缓冲区,只有按回车键后 scanf 才会进入这个缓冲区和取数据,所取数据的个数取决于 scanf 中“输入参数”的个数)
若scanf 只有一个输入参数,按回车键后 scanf 只会取一个数据
③如果 j 没有赋值, j 就不会输出!

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf编写出高质量代码
	*/
	# include <stdio.h>
	int main (void)
	{
		int i;
		
		scanf("%d", &i);
		printf("i = %d\n",i);
		
		int j;
		
		scanf("%d",&j);
		printf("j = %d\n",j);
	
		return 0 ;
	}
	/*
	在VS2013中输出结果是:
	------------------------
	●用户输入时输入:
	123m
	(i = 123,j = 非法的输入)
	------------------------
	*/

④while()的作用:把键盘内的字一直读出来,赋值给变量ch,变相清空键盘缓存区仍有的数据
⑤\n是转义字符,表示当接收到数据为\n转行时,while为假,跳出循环

	/*
	时间:2020年1月
	编辑人:pinkowonote
	功能:\
	目的:如何使用scanf编写出高质量代码
	*/
	# include <stdio.h>
	int main (void)
	{
		int i;
		char ch;
		scanf("%d", &i);
		printf("i = %d\n",i);
	
		/*①while()的作用:把键盘内的字一直读出来,
		赋值给变量ch,变相清空缓存区仍有的数据*/
		/*②\n是转义字符,表示当接收到数据为\n转行时,
		while为假,跳出循环*/
		while( ( ch=getchar() )= ‘\n’ )
			continue;
		
		int j;
		scanf("%d",&j);
		printf("j = %d\n",j);
	
		return 0 ;
	}
	/*
	在VS2013中输出结果是:
	------------------------
	●用户输入时输入:
	123m
	(i = 123)
	89(用户继续输入)
	(j = 89)
	------------------------
	*/
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!