printf的转换说明
printf的类型输出
%d 有符号整数
%u 无符号整数
%x 16进制小写
%X 16进制大写
%g 自动判断用普通方法还是科学计数法输出合适(不会显示多余的0)
%c 单个字符
%s 字符串
%p 指针
%% 会输出%(单个%不能达到输出%的目的)
printf的修饰符
1."标记"
- 向前对其(向左对齐)
+ 符号显示
空格 前导空格(如果规定了输出的最大位数不够的会用空格补全)
0 前道0(如果规定了输出的最大位数不够的会用0补全)
# (1.在与%0和%x一起使用时可以显示对应格式 2.在与%g一起用时可以防止结果后 的0被删除)
2."数字" 最小宽度
例如 = 输出1会输出 “空格空格3”;
3.".数字“
与%e,%f, %lf一起使用用来规定小数点右边数字位数
与%g,%G一起使用,用来规定有效数字最大位数
与%一起使用表示带打印字符最大数量
scanf相关
scanf_s为什么更安全?
因为scanf是不会进行边界检查的,所以允许在你当前写入的区域紧接着的区域被写入数据,那么在执行你自己的程序的时候可能会在超出你自己所用的区域之外的区域执行,也就是缓冲区溢出,而scanf_s只会允许你写入我规定大小的这么一块区域,在此区域的后面是不允许你进行操作的,也不会允许你运行之后区域的东西。也就防止了缓冲区溢出的问题。
scanf_s是不能自己进行类型转换的
比如
int a,b,c;
char f;
1.scanf_s("%d",&a);
2.scanf_s("%d",&b);
3.scanf_s("%c",&f);
4.scanf_s("%d",&c);
输入:a123
首先第一个scanf_s会到输入缓冲区读取输入,它会读到a,但是他要读的是%d类型的所以会读取失败,a的值为空
接着第二个scanf_s到缓冲区读取,他仍然会首先读到a但他需要的是%d的类型,所以b的值也为空
然后第三的scanf_s会读到a,而他需要的正是%c类型的所以它会将a读到f中f此时的值为a
再接着最后一个scanf_s会从a后面接着读,所以c的值被成功赋值为123.