标签 scanf 下的文章
 2015-11-28T22:28:27.102578    |      C/C++    |     AilsonJack    |     暂无评论    |     845 views
最近写一个小程序需要用到scanf()函数,发现scanf()函数虽然简单,但是使用起来还是有点小困难,这里我就结合自己的使用以及网上的一些内容,讲一些关于scanf()函数的小知识,博主觉得还是挺有用的哦。scanf函数与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。1、基本说明scanf函数调用形式为: scanf(“<格式说明字符串>”,<变量地址>);变量地址要求有效,并且与格式说明的次序一致。(1)、格式说明符转换字符(就是%后跟的部分)a 读浮点值(仅适用于 C++)A 读浮点值(仅适用于 C++)c 读单字符d 读十进制整数i 读十进制、八进制、十六进制整数e 读浮点数E 读浮点数f 读浮点数F 读浮点数(仅适用于 C++)g 读浮点数G 读浮点数o 读八进制数s 读字符串x 读十六进制数X 读十六进制数p 读指针值n 至此已读入值的等价字符数u 读无符号十进制整数[ ] 扫描字符集合% 读 % 符号(百分号)格式说明符的修饰符说明L/l 长度修饰符 输入”长”数据h   长度修饰符 输入”短”数据W   整型常数 指定输入数据所占宽度* 表示本输入项在读入后不赋值给相应的变量(2)、空白符空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。控制串中的空白符使scanf() 在输入流中跳过一个或多个空白行。空白符可以是空格(space)、制表符(tab)和新行符(newline)。本质上,控制串中的空白符使scanf() 在输入流中读,但不保存结果,直到发现非空白字符为止。(3)、非空白符一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。非空白符使scanf()在流中读一个匹配的字符并忽略之。例如,”%d,%d”使 scanf()先读入一个整数,读入中放弃逗号,然后读另一个整数。如未发现匹配,scanf()返回。说明:1)、百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存。因此,scanf(“%d%*c%d”,&x,&y); 对10/20的读入操作中,10放入变量 x,20放入 y,’/’不保存。2)、虽然空格、制表符和新行符都用做域分割符号,但在读单字符操作中却按一般字符处理。例如,对输入流”x  y“调用:scanf(“%c%c%c”,&a,&b,&c);返回后,x在变量a中,空格在变量b中,y在变量c中。3)、控制串中的其它字符,包括空格、制表符和新行符,都用于从输入流中匹配并放弃字符,被匹配的字符都放弃。例如,给定输入流”10t20“,调用:scanf(“%dt%d”,&x,&y); 将把10和20分别放到x和y中,t被放弃,因为t在控制串中。2、scanf()函数中%[]格式控制符用法此格式控制符的基本格式为:%[scanfset]scanfset 有两种形式:a、一种是以非“^”字符开头的scanset,表示在读入字符串时将匹配所有在scanfset中出现的字符,遇到非scanfset中的字符时输入就结束;b、另外一种形式是以“^”字符开头的scanfset,表示在读入字符串时将匹配所有不在scanfset中出现的字符,遇到scanfset中的字符输入就结束。scanfset中的’-’连接符:当“-”出现在scanfset中且两边都有字符时,大多数编译器都做了如下所述实现:“-”表示匹配从其左边的字符到右边字符之间所有的字符(按ASCII码排序)。如a-z表示a到z的所有字符,又如0-9表示0到9这十个数字。所以,当scanfset为0-9时表示只匹配数字串,当scanfset为A-Za-z时表示只匹配字母(包括大小写),当scanfset为^0-9时不匹配所有数字。注意:“-”的字符只有在其左右两边都有有效字符时才有这个作用,否则被认为是普通字符,如“0-4-6-9”匹配的字符为{0,1,2,3,4,-,6,7,8,9},这样也为输入“-”字符提供了方法。例1:遇到非小写字母输入结束例2:遇到回车键输入结束当要匹配右侧’]’或者’^’时,得这样去做。如果是右侧方括号时,得把它放在紧跟在左侧方括号的后边,也不可以有空格,如:%[]ajdfidfj ];如果是’^’时,把它放在除了紧跟在左侧方括号后边的其它位置,如:%[ gfadhfu^fhgiu ] 。例3:匹配’[’和’^’可用上述代码输入: a]bc^e fg,由于e与fg之间有空格,空格不属于scanfset中的字符,因此输入就结束了,程序打印出a]bc^e。3、如何让scanf()函数正确接受有空格的字符串?如何让scanf()函数正确接受有空格的字符串?如: I love you!上述程序并不能达到预期目的,scanf()扫描到”I”后面的空格就认为对str的赋值结束,并忽略后面的”love you!”。这里要注意是”love you!”还在stdin流中(关于这个问题,网上我所见的说法都是在键盘缓冲区,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的开始部分),请看下面的程序:4、用“空格符”来处理缓冲区残余信息例1:没使用空格控制符输出:0 1 2 3 4 ,数字加空格正好为10,和程序中scanf函数执行了10次是匹配的。例2:使用了空格控制符那么为什么例2就正确呢,原因何在,在%前面加一个空格就这么有用,答案是肯定的,就是%前面的空格在起作用,在scanf的使用过程中应注意的问题中(这些内容在下面)已经指出:“scanf()的格式控制串可以使用空白字符或其它非空白字符,使用空白字符会使scanf()函数在读操作中略去输入中的零个或多个空白字符。”5、使用scanf函数应注意的问题1)、对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上”&”操作符。2)、可以在格式化字符串中的”%”各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。3)、scanf()函数中没有精度控制。如:scanf(“%5.2f”,&a); 是非法的。不能企图用此语句输入小数为2位的实数。4)、scanf中要求给出变量地址,如给出变量名则会出错如:int a;scanf(“%d”,a);是非法的,应改为scanf(“%d”,&a);才是合法的。5)、在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。6)、在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符如:scanf(“%c%c%c”,&a,&b,&c);输入:d e f则把’d’赋予a, ‘ ‘(空格)赋予b,’e’赋予c。因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把’ ‘作为下一个字符送给b。只有当输入为:def(字符间无空格)时,才能把’d’赋于a,’e’赋予b,’f’赋予c。如果在格式控制中加入空格作为间隔:如:scanf(“%c  %c  %c”,&a,&b,&c); 则输入时各数据之间可加空格。7)、如果格式控制串中有非格式字符则输入时也要输入该非格式字符。如:scanf(“%d,%d,%d”,&a,&b,&c);其中用非格式符 ’,’ 作间隔符,故输入时应为:5,6,7又如:scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);则输入应为:a=5,b=6,c=76、小程序这个小程序主要完成对输入的一系列数据进行求和:
CC++库函数scanf 阅读全文»
  • 1

  本站信息

目前本站共被浏览 154800 次
目前本站已经运行 3306 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号