scanf()补遗

格式化输入
TAG: 格式输入,标准输入输 出
TEXT:
scanf函数是一个标准库函数,scanf函数能够完成精确的格式化输入,其功能是:按照给定的格式 从标准输入设备上接收整型、实型、字符型和字符串等各种类型的一个或多个数据的输入并将其保存到指定的变量中。



表3-2 修饰符以及意义
①域宽
可以用一个十进制数指定输入数据的数据宽度,系统自动按域宽截取输入数据。?
例如:int a;
scanf(“%3d”,&a);表示按宽度3输入一个整数给变量a。如果读入数据 为:123456<回车 >,则变量a实际接收的值为123。
例如:int a,b,c;
scanf(“%2d%3d%4d”,&a,&b,&c);如果读入数据 为:123456789<回车>,则变量a、b 、c 的值分别是12、345和6789。可以实现数据的自动截取。
②字符*
*表示按指定格式读入数据但不赋予相应的变量,作用是跳过相应的读入数据。
例如:int a,b,c;
scanf(“%d%*d%d”,&a,&b,&c);执行该语句,若输入为 1? 2? 3<回车>,结果为a=1,b=3,c未赋值,2被跳过。
例3-1 一个实际问题——处理一个日期数据。
假设日期读入的格式为: 12-2-2003或12/02/2003,该数据格式中的年、月、日三个数据需要保存,但是连接年、月、日数据的连接符需要被废弃。
当用户以12-02-2003形式键入日期数据时,该数据中的每一个数值(年、月、日)需要被读入对应 的变量year、month、date内存单元中,为了去掉不需要的将年、月、日数据分开的连接符,直接方法是将这些字符包含在scanf的格式控制串 中。
例如将语句写成:scanf(“%d─%d─ %d’,&date,&month,&year);这条语句可以去掉以12-2-2003形式读入数据中的连字符,但是当用户输 入如下格式的日期数据::12/2/2003或12:2:2003时,该语句语句不仅不能去掉不需要的字符(/或:),还会造成数据错误(只能正确得到 date数据)。如果在输入格式字符串中使用scanf函数提供的*,将语句写成:

scanf(“%d%*c%d%*c %d’,&date,&month,&year);就能够从输入数据中读取有效数据并废弃任何%*c所指定的数据(不将其赋给某 个变量)。

 

 

                                                                          以上摘自:http://www.neu.edu.cn/cxsj/pointchart/c4/Page4.html

 

 

今天下午做了一些关于scanf函数的学习,总结一下,以备后查。
测试程序比较杂,测试用例也比较杂,贴出来没啥意义。下面是总结:
字符类型:
//读取字符时,当格式控制串中无空白符 ,读取参数是严格按照一个字符一个字符的读取 遇到空白符时读取空白符, 直到所有参数读满为止
//当格式控制串中有空白符时 ,读取参数也是严格按照一个字符一个字符的读取,但遇到空白符时跳过空白符继续读取下个非空白符 ,直到所有参数读满为止

整形:
//当读取整形时,当格式控制串为指定长度时,按照指定长度来读,遇到空白符或达到指定长度完成一个参数的读取 ,直到所有参数读满为止
//格式控制串没有空白符时,默认是按照数值范围读取, 遇到空白符完成一个数据读取 ,直到读满为止
//遇到类型不匹配时,从程序缓冲区跳出,不读取数据, 程序缓冲区指针位置不变,例如在scanf 读取 整形时,由于类型不匹配, 从指定的地方跳出,此时,
//缓冲区的指针指向 a,即不匹配点 下面的函数可以继续读直到 类型匹配为止

字符串类型:
//字符串读取时,也是可以指定长度,当到达指定长度或者遇到空白符是结束读取,如果想读取空白符,可以采用 %[^/n]等形式指定终止符来实现

比较:
//读取字符和读取整形的区别在于字符的格式控制串会对读取有影响,影响是否读取空白符,
//而读取整形时默认是不会读取空白符的
//读取字符串是也是默认不会读取空白符

//scanf有返回值,返回的是读取的参数的个数,而不是参数的长度,可以用来判断是否函数读入完整的参数。

总结比较抽象,自己试验一下可能效果会好一些。个人觉得有比较更容易记忆,核心就是这个,其他的细节编程时尝试一下就可以了。
以上仅供参考,有了新认识还会再去修改。

 

                                      以上摘自:http://wxdlut.blog.163.com/blog/static/12877015820100611258434/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值