<转>scanf格式化详解

scanf格式控制的完整格式:

  %     *     m     l或h     格式字符
  ①格式字符与printf函数中的使用方式相同,以%d、%o、%x、%c、%s、%f、%e,无%u格式、%g格式。
  ②可以指定输入数据所占列宽,系统自动按它截取所需数据。如:
  scanf( "%3d%3d", &a, &b);
  输入:123456
  系统自动将123赋给a,456赋给b。
  ③%后的“*” 附加说明符,用来表示跳过它相应的数据。例如:
  scanf( "%2d%*3d%2d", &a, &b);
  如果输入如下信息:1234567。将“12 ”赋给a,“67 ”赋给b。第二个数据“345”被跳过不赋给任何变量。
  ④输入数据时不能规定精度,例如:
  scanf( "%7.2f", &a);
  是不合法的,不能企图输入:12345.67而使a的值为12345.67。

附加格式说明字符:
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
         字符                                   说明 
  ——————————————————————————————————————
            l           用于输入长整型数据(可用%ld,%lo,%lx)以及double型数据(用%lf或%le)
  ——————————————————————————————————————
            h           用于输入短整型数据(可用%hd, %ho, %hx) 
  ——————————————————————————————————————
        域宽         指定输入数据所占宽度(列数),域宽应为正整数 
  —————————————————————————————————————— 
          *           表示本输入项在读入后不赋绐相应的变量
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
------------------相关-------------------
输入数据流分隔
  ①根据格式字符的含义从输入流中取得数据,当输入流中数据类型与格式字符要求不符时,就认为这一项结束。例如:
  scanf( "%d%c%f", &a, &b, &c);
  如果输入如下信息:
  1234r1234.567
  则scanf函数在接收数据时发现“r”类型不匹配,于是把“1234”转换成整型赋值给a,把“r”赋给变量b,最后把“1234.567”转换成实型数据赋给c。
  ②根据格式项中指定的域宽分隔出数据项。如语句:
  scanf( "%2d%3f%4f", &a, &b, &c);
  如果输入如下信息:
  123456789012345
  则scanf函数在接收数据时根据域宽把12赋值给a,345赋值给b,6789赋值给c。
  ③隐示分隔符。空格、跳格符(‘\t‘)、换行符(‘\n‘)都是C语言认定的数据分隔符。
  ④显示分隔符。在scanf函数的两个格式说明项间有一个或多个普通字符,那么在输入数据时,在两个数据之间也必须以这一个或多个字符分隔。如语句:
  scanf( "a=%d,b=%f,c=%f", &a, &b, &c);
  则输入数据应该为:
  a=1234,b=67.8,c=98.123

---------------------------------------
关于scanf函数的进一步说明:
  ①scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如,如果a、b为整型变量,则
  scanf( "%d,%d", a, b);
  是不对的,应将“a, b”改为 “&a, &b”。
  ②如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。例如:
  scanf( "%d,%d", &a, &b);
  输入时应输入:3,4。3与4之间的逗号应与scanf函数中的“格式控制”中的逗号相对应,输入其它符号是不对的。
  ③在用“%c”格式输入字符时,空格字符和转义字符都作为有效字符输入。
  scanf( "%c%c%c", &c1, &c2, &c3);
  如输入:a b c 。字符 ‘a‘ 赋给c1,字符(空格)‘     ‘ 赋给c2,字符 ‘b‘     赋给c3。
  ④ scanf        中不使用U说明符.对unsigned型数据用d、o、x说明符输入.

补充:

对于 const char* p = "12232114687ABC12356";
  scanf( "%[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"就表示跳过一行,"%-20[^\n]"就表示读取\n前20个字符。

时间: 2024-12-25 23:37:13

<转>scanf格式化详解的相关文章

【C语言天天练(二十)】scanf函数详解

引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易.本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>). 1.一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值.但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取

easyui的datetimebox时间格式化详解

今天公司让用easyui的datetimebox组件,而且还要让格式化成大家通用的那种,网上搜了很多,但差不多都是复制黏贴的,最后请教了下螃蟹. 感谢螃蟹抽空给做了个例子,现在拿出来和大家分享下,效果图如下这里主要实现了两个功能,一个是将时间格式化,一个是将年月日时分秒全都剥离了出来,可以随意调用. 具体的代码可到螃蟹博客主页看下,地址: http://www.itxxz.com/a/kuangjia/2014/0603/12.html easyui的datetimebox时间格式化详解,布布扣

C语言scanf函数详解

函数名: scanf 功 能: 运行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.能够读入不论什么固有类型的数据并自己主动把数值变换成适当的机内格式. 其调用格式为:      scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF. 其控制串由三类字符构成: 1.格

scanf函数详解

函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式.其调用格式为:      scanf("<格式化字符串>",<地址表>);scanf()函数返回成功赋值的数据项数,出错时则返回EOF.其控制串由三类字符构成:1.格式化说明符: 2.

js时间格式化详解

前言: js虽然提供了各种获取时间Date对象的不同属性方法,如:getDate 方法 | getDay 方法 | getFullYear 方法 | getHours 方法 ... ... 等等,但是却没有像java那样提供一个方法来供用户来根据自身提供的模板(pattern),来格式化指定时间对象,所以自己就封装了一个小方法,只供大家闲来调侃-.-,有好的建议还望慷慨指荐哦. 用到知识点: arguments:该对象代表正在执行的函数和调用它的函数的参数.不可显式创建,虽然有length属性,

Linux系统下超大硬盘快速格式化详解

MBR,全称为Master Boot Record,即硬盘的主引导记录. 为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序.分区表及分隔标识),也就是上面所说的主引导记录:而狭义的MBR仅指引导程序而言.其所支持的最大卷:2T (T; terabytes,1TB=1024GB),对分区的设限:最多4个主分区或3个主分区加一个扩展分区. 由于MBR分区表的最大可寻址的存储空间只有2Tb(232×512字节),因此,在大硬盘出现的现在,MBR分区方式逐渐被GUID分区

c++获取键盘输入cin、scanf使用详解

cin是c++标准,scanf是在c中使用的 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 5 using namespace std; 6 7 int main() 8 { 9 /* 10 strlen包含在string.h头文件里,加上 11 #include <string.h> 12 #include <cstring> // C语言头文件为 string.h

format格式化详解

format函数可以接受不限个数,位置可以不按顺序. 1.不设置指定位置,按默认顺序: print('我叫{},今年{}岁'.format('全帅','80')) 输出:我叫全帅,今年80岁 根据参数,默认按顺序,往{}传值 2.设置指定,根据下标 print('我叫{0},今年{1}岁'.format('全帅','80') ) 输出:我叫全帅,今年80岁 根据0,1下标,参数第一位,传入0,第二位,传入1,第三位传入2,前面{}内填的几,后面就根据前面往里传参: 3.设置参数 print('我

Android命名格式化详解

 严格换行 一般情况下一个“:”一换行 建议函数的“{}”分别占一行 例:public void ooSomething() { …… } 不要用: 例:public void doSomething(){ …. } 其实两种方式都可以,这里不做硬性规定. 最好用第一种方式因为在eclipse中用这种方式也很方便. 严格缩进 使用Tab缩进 注释缩进和代码缩进对齐 严格注释 文件,类,方法,方法参数,变量,属性都要注释 每个有含义的变量都要写注释. 文件和类的注释一定要包含如下元素: Name,