printf和scanf整理(后续填补)
scanf和printf头文件:<stdio.h>
1.%d、%3d、%03d、%-3d区分
%d:以十进制形式输出整数(int)
%3d:指定宽度为3,不足的左边补空格
%03d:一种左边补0 的等宽格式,比如数字12,%03d出来就是: 012
%-3d:左对齐,不足三位右边用空格填补
#include<stdio.h>
int main()
{ int a = , b = , c = ;
printf("%d %d %d\n", a, b, c);
printf("%3d\n%3d\n%3d\n", a, b, c);
printf("%03d\n%03d\n%03d\n", a, b, c);
printf("%-3d\n%-3d\n%-3d\n", a, b, c);
return ;
}
2.scanf和scanf_s的区别
①一般情况下,两者可互相代替:有个int型变量a,于是有scanf("%d",&a)等价于scanf_s("%d",&a)
②scanf_s并非是标准库的函数,而是VS中用以确保数据不会溢出。
比如,有个char b[10]的字符数组,一般下用scanf("%s",b),但是如果输入时的字符串长度超过9呢?(大小为10的字符数组最多存储长度为9的字符串,因为最后一个位置要存储空字符)可能会导致溢出或对程序之后的输入造成影响。

(图 dev-C++编译)
可见,scanf可能会造成内存泄漏,尽管可能上图这种情况下能正确执行(和编译器对代码检查严格是否有关),但是的的确确会有逻辑错误(数组b的元素最大下标是9,而这里b[10]竟然能够成立),而这对于程序员而言是不允许的。
如果换成在VS 2015 IDE中编译(上面这个程序不在VS中执行,是因为scanf函数在VS中会报错,除非对编译环境进行修改(本萌并没有试过~)),采用scanf_s函数如下:
#include<stdio.h>
int main()
{
char b[] = { '\0' };
scanf_s("%s", b,);
int n;
scanf_s("%d",&n);
printf("b=%s\nn=%d\n", b, n);
printf("b[9]=%c\n", b[]);
return ;
}
执行情况:

图1:由于输入的字符串长度超过9,并且大于10,以至于读入b数组出错,经过调试会发现,此时b中第一个为ASCII码为0的空字符,之后9个竟然是ASCII值为-2的'?'。b数组输入结束后,由于输入流此时还有数据,缓冲不为空,以至于给整型n赋值时直接从输入流中读取剩下的数字(注意,此时存入n为数字,而不是字符)。
图2:当刚好输入10个字符时,由于b数组只能存长度为9的字符串,仍然出错。但是此时输入流缓冲为空,所以能继续输入数据,赋值给b。
图3:当输入的字符串长度小于等于9时,则是正常输入情形。由于b[9]为空字符,而空字符并不能显示输出,就有图3的结果。
③scanf_s用法:当不是输入字符串时,和scanf格式相同;当输入字符串时,必须要在最后指出最大读入的字符个数(注意,不是字符串长度,读者可以尝试将上个代码中的10改为9,然后采用图3的输入数据,b数组则会出错)。
printf和scanf整理(后续填补)的更多相关文章
- printf和scanf
一 printf和scanf(printf和scanf是c语言中的输入输出库函数) printf(”格式控制“,输出列表) <1>格式控制 其中包含 格式声明(%+相应格式对应字母).转义 ...
- C的printf与scanf的用法
之前没学过C语言,只学过C++,所以就来自学下C语言了,其实个人认为C与C++的区别很小,基本上就是printf与scanf这点输出和输入的区别了,如果还有什么区别的话那就是要包含的头文件是不同的.比 ...
- 【转】stm32CubeMx上移植自己的printf()和scanf()函数
要想printf()和scanf() 函数工作,我们需要把printf()和scanf() 重新定向到串口中.重定向是指用户可以自己重写C 的库函数,当连接器检查到用户编写了与C 库函数相同名字的函数 ...
- printf()与 scanf()
一直以来就没有认真看过控制台输入输出的格式,现今找了一些材料,分享如下: 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ ...
- C语言: 运算符,printf,scanf的用法
运算符/的运算结果和运算对象的数据类型有关,两个数都是in,则商就是int,取整数部分:被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不去掉小数部分如:16/5 == 3:16/5.0 ...
- 数据类型、常量、变量、printf、scanf和运算符
数据类型 常量 变量 printf函数介绍 scanf函数介绍 运算符 数据类型 数据类型是指数据在内存中存储的方式. C语言中有5大数据类型:基本类型.构造类型.指针类型.空类型.定义类型. C语言 ...
- 重学C语言 -- printf,scanf
printf(); 用来显示格式串的内容 注意: 参数不可以换行,否则会出一个警告. 格式串中占位符比表达式数量多 会显示一个无意义值 格式串中占位符比表 ...
- printf与scanf的返回值、注意点
printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数 ...
- C++中printf和scanf的用法
(一)printf的用法 printf:按格式打印,向控制台输出.print:打印 ,f:formate,格式化. 在使用printf向控制台输出时,不建议使用中文字符串,中文字符串的问题比较复杂,有 ...
随机推荐
- IOS的UIPickerView 和UIDatePicker
1.UIPickerView的常见属性 //数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id<UIPikerViewData ...
- maven命令更新子父项目的pom版本
Q:一个maven项目,有多个子module,在顶级父pom.xml里设置<version>1.0.0-SHAPSHOT</version>,在子pom.xml里都用了 < ...
- jQuery选择器的优点
jQuery选择器的优点 相信小伙伴们对选择器并不陌生,从css1到css3的选择器有很多,但是JQuery都能完美的支持,而且API操作起来也特别方便好用,在很大程度上精简了代码,节约了很多性能.那 ...
- Android studio 断点技巧
写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression , 知道条件断 ...
- FutureTask——另一种闭锁的实现
关于多线程,我们接触对多的,最基础,入门的可能就是实现Runnable接口继承Thead类,因为Java单继承的原因,通常建议是实现Runnable接口.但这种"简单"的线程会带来 ...
- python 分片
有些书中叫做分片,有些书中叫做切片,翻译时的一些误差) 概念:将序列按段进行切割 作用:通过分片操作符来访问一定范围内的元素 实现:分片是通过两个冒号相隔的索引来实现 范围:符合序列特性即可使用切片功 ...
- 微信小程序对医疗创业的启示,“餐饮+微信小程序”的猜想
一:微信小程序对医疗创业的启示:如何用完即走 仔细看了张小龙在28日微信公开课上发布小程序时的演讲全文,我觉得对解决当下医疗创业的困惑有着巨大的启发.没准还能开辟新的未来. 张小龙对小程序精髓的阐释是 ...
- swift学习 - 计时器
swift学习之计时器 这个demo主要学习在swift中如何操作计时器(Timer),按钮(UIButton),文本(Label) 效果图: 代码 import UIKit class ViewCo ...
- 5.Java 加解密技术系列之 DES
Java 加解密技术系列之 DES 序 背景 概念 基本原理 主要流程 分组模式 代码实现 结束语 序 前 几篇文章讲的都是单向加密算法,其中涉及到了 BASE64.MD5.SHA.HMAC 等几个比 ...
- Java项目和maven项目中如何获取&设置配置文件中的属性
通常情况下,我们会在一些配置文件文件中配置一些属性.如: indexPath = E\:\\Tomcat_7.0\\webapps\\ipost_stage\\lucene\\index imgUpl ...