下一篇:c语言文件的输入输出
printf
%[flags][width][.prec][hlL]type
scanf
%[flag]type
现在研究以上的东西
一、flag逐一演示:
-(减号)
printf("%9d\n", 123); //9代表输出占9个字符的空间
printf("%-9d\n", 123);//加了-就是左对齐了,默认是右对齐
+(加号)
printf("%+9d\n", 123);
printf("%-9d\n", 123);
又有+号又有-号,左对齐+加号
printf("%-+9d\n", 123);
printf("%-+9d\n", -123);
当这个数是个负数则会加上负号
不要+号呢?
printf("%-9d\n", -123);
还是会显示负号,不然值就不对了,所以+可以认为强制输出负号
0
printf("%09d\n", -123);//注意左对齐-不能和填0一起用
二、宽度
演示:宽度:
printf("%9.2f\n", 123.0);
*号:
printf("%*d\n",6, 123);//等同于%6d
这样做就相当于参数,也就可以放变量,为格式化带来便利
同样.*也是如此
三、修饰符hlL 用来修饰类型
printf("%hhd\n",12345);//输出一个字节的整数,12345取16进制是0x3039,如果只取39就是57
四、最后是类型
%n演示:
vs不支持这么写
#include<stdio.h>
int main(int argc,char const *argv[])
{
int num;
printf("%hhd%n\n",(char)12345,&num);
printf("%d\n",num);
return 0;
}
用gcc尝试
输出成功
改为:
printf("%dty%n\n",12345,&num);
输出
所以%n代表printf做到这个地方是时候已经输出了多少个字符,填到指针所指的那个地方去(注意不要忘记&)
最后:scanf %[flag]type 比printf简单
*号演示
int num;
scanf("%*d%d",&num);//跳过一个字符再读一个
printf("%d\n",num);
会发现跳过了123
scanf的类型
%i演示
int num;
scanf("%i",&num);
printf("%d\n",num);
16进制
8进制
[…]演示
这是gps可能产生的数据
要这么输入
%*表名要跳过,[^,]表示到逗号之前所有的东西,连起来就是到逗号为止的东西都不要
之后紧接着的,号是读一个,前提是要在输入中有(在scanf中只要不是%就是输入中一定要存在的东西)
之后的%[^,] 表示读到逗号为止,读到sTime里面去
之后以此类推
[]里面可以写的很复杂这里不展开
最后printf和scanf的返回值
读入的项目数
输出的字符数
在要求严格的程序中,应该判断每次调用scanf或printf的返回值,从而了解程序运行中是否存在问题
演示:
int num;
int i1=scanf("%i",&num);//i1是读入个数
int i2=printf("%d\n",num);//i2是输出个数
printf("%d:%d\n",i1,i2);
scanf说读到了1个字符(1234)
printf说它输出了1 2 3 4 还有回车换行,一共5个字符