scanf格式控制字符串_第1页
scanf格式控制字符串_第2页
scanf格式控制字符串_第3页
scanf格式控制字符串_第4页
scanf格式控制字符串_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

scanf格式控制字符串%Reading Undelimited strings*To read strings not delimited by whitespace characters, a set of characters in brackets ( ) can be substituted for the s (string) type character. The set of characters in brackets is referred to as a control string. The corresponding input field is read up to the first character that does not appear in the control string. If the first character in the set is a caret (), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.*Note that %a-z and %z-a are interpreted as equivalent to %abcde.z. This is a common scanf function extension, but note that the ANSI standard does not require it.举一些例子: 对于 const char* p = 12232114687ABC12356; sscanf(p,%123,buf); / 就把是1或2或3的字读读到buf中,直到遇到一个不是1且不是2且不是3的字符,于是执行后buf应该是1223211; %123等同于%231,等同于%321,列表中的顺序是无所谓的; %123也等同于%1-3或%3-1,也就是“1至3”,对于连续的字符列表这样写就很简单,比如%a-z等同%abc省略z; 想想看,%3-14应该等同于什么?是“3至14”吗?当然不是,因为中的是字符,而不是数字,所以%3-14应该等同于%3214,等同于%1234; 同理,想只取字母,那就可以写成%A-Za-z; 如果列表的第一个字母是,那么正好相反,比如%A-Za-z的意思就是取字母之外的所有字符。 对于字符串abDEc123如果想按照字母和数字读到两个字符串中就应该是 %a-zA-Z%0-9,buf1,buf2 ; 假如我想取一行字符,该怎么办?%s是不行的,因为%s遇到空白字符(空格、制表符、r、n)就结束了,所以可以写成 %n%*c,%n的作用刚才讲过了,就是读n之外的所有字符,也就是说读到n为止,%*c的作用就是把n去掉,否则再次读的时候一直遇到的都是n; 所有对%s起作用的控制,都可以用于%,比如%*n%*c就表示跳过一行,%-20n就表示读取n前20个字符。scanf/sscanf 格式的特殊控制代码scanf中一种很少见但很有用的转换字符:.和.。#includeintmain()charstrings100;scanf(%1234567890,strings);printf(%s,strings);return0;运行,输入:1234werew后,结果是:1234。通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符,那么就提取该字符;如果一经发现不属于就结束提取。该方法会自动加上一个字符串结束符到已经提取的字符后面。scanf(%1234567890,strings);它的作用是:如果一经发现输入的字符属于方括号内字符串中某个字符,那么就结束提取;如果不属于就提取该字符。该方法会自动加上一个字符串结束符到已经提取的字符后面。注意:方括号两边不能空格,如:scanf(%1234567890,strings);scanf(%1234567890,strings);不让空格也会算在里面的。用这种方法还可以解决scanf的输入中不能有空格的问题。只要用scanf(%n,strings);就可以了。很神奇吧。ANSIC标准向scanf()增加了一种新特性,称为扫描集(scanset)。扫描集定义一个字符集合,可由scanf()读入其中允许的字符并赋给对应字符数组。扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。例如,以下的扫描集使scanf()读入字符A、B和C:%ABC使用扫描集时,scanf()连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以null结尾、由读入字符组成的字符串。用字符可以说明补集。把字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指示scanf()只接受未说明的其它字符。对于许多实现来说,用连字符可以说明一个范围。例如,以下扫描集使scanf()接受字母A到Z:%A-Z重要的是要注意扫描集是区分大小写的。因此,希望扫描大、小写字符时,应该分别说明大、小写字母。搜集一些特殊用法:%的用法:%表示要读入一个字符集合,如果后面第一个字符是”,则表示反意思。内的字符串可以是1或更多字符组成。空字符集(%)是违反规定的,可导致不可预知的结果。%也是违反规定的。%a-z读取在a-z之间的字符串,如果不在此之前则停止,如chars=hello,myfriend”;/注意:,逗号在不a-z之间sscanf(s,“%a-z”,string);/string=hello%a-z读取不在a-z之间的字符串,如果碰到a-z之间的字符则停止,如chars=HELLOkitty”;/注意:,逗号在不a-z之间sscanf(s,“%a-z”,string);/string=HELLO%*=前面带*号表示不保存变量。跳过符合条件的字符串。chars=notepad=1.0.0.1001;charszfilename32=;inti=sscanf(s,%*=,szfilename);/szfilename=NULL,因为没保存inti=sscanf(s,%*=%s,szfilename);/szfilename=1.0.0.1001%40c读取40个字符%=读取字符串直到碰到=号,后面可以带更多字符,如:chars=notepad=1.0.0.1001;charszfilename32=;inti=sscanf(s,%=,szfilename);/szfilename=notepad如果参数格式是:%=:,那么也可以从notepad:1.0.0.1001读取notepadscanf()函数用法小结虽然有人说在大型程序设计中永远不要使用scanf(),但是对于习惯用C的人和参加ACM/ICPC的人,scanf()还是用的比较多的,而且用好了用起来也很方便下面整理一点儿平时常需要用到而可能有些人一直理不清的一些知识一般常识:scanf()函数的一般格式为:scanf(格式字符串,输入项首地址表)scanf的格式控制的一般形式为:% 宽度F|Nh|l类型字符 * 中的控制字符为可选项 * *表示该输入项读入后不赋予任何变量,即跳过该输入值。这在减小内存开支上面还是有一点用处的,不需要的字符直接跳过,免得申请没用的变量空间 * 宽度表示输入读入字符的长度,对于整型表示截取相应宽度的数字赋给后面列表中的相应变量;对于字符型表示读入相应长度的字符后把第一个字符赋给相应的变量,其余的自动舍弃。例如scanf(%2d%3d,&a, &b);如果输入为12345则将12赋给a,将45赋给b;scanf(%2c%3c,&a, &b);如果输入为12345则将1赋给a,将3赋给b * F 、N、h、l分别表示远指针、近指针、短整和长整型,对于_int64相应的控制字符为ll或I64 * 类型字符为 d - 输入十进制整数 、o - 输入八进制整数 、x - 输入十六进制整数 、u - 输入无符号十进制整数 f或e - 输入实型数(用小数形式或指数形式) 、c - 输入单个字符 、s - 输入字符串字符串读入的一些技巧对于输入字符串还有一些比较有用的控制,例如经常需要读入一行字符串,而这串字符里面可能有空格、制表符等空白字符,如果直接用%s是不可以的,于是有些人就想到用gets(),当然这也是一种选择,但是懂C的人基本上都知道gets()是一个很危险的函数,而且很难控制,特别是与scanf()交替使用时前者的劣势更是一览无余,所以gets()一般是不推荐用的,其实用%n就可以很好的解决这个问题了,表示非,即读入其后面的字符就结束读入。这样想读入一行字符串直接用scanf(%n%*c,str);就可以了,%*c的作用是读入n,否则后面读入的将一直是n。所有对%s起作用的控制都可以用%,比如%0-9表示只读入0到9之间的字符,%a-zA-Z表示只读入字母,-是范围连接符,当然也可以直接列出你需要读入的字符,上面读字母之所以用范围连接符是因为要输入52个字符太麻烦了,如果你只需要读abc里面的字符就可以用%abc (或者%cab、%acb、%a-c、%c-a.),如果想读入某个范围之外的字符串就在前面加一个,如:%a-z就表示读入小写字母之外的字符上

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论