格式化输入:
scanf:
%[flag]type
格式化输出:
printf:
%[flags][width][.prec][hIL]type
对于flags,表示的是标志,可以使用的内容如下:
举例事例:
int main(){
printf("%9d\n",123);
printf("%-9d\n",123);
return 0;
}
输出结果是:
123
123
第一行比第二行左边多了6个空格,事实上就是将我要输出的东西长度固定为9,并且向右靠拢
(空格+字符长度(<=9的情况下)=9)
+的意思就显示其正负号(如果本身数字是负数,如
printf("%+d\n",-123));
那么最终输出还是-123,和没有+号一样
如果是
printf("%09d\n",123);
那么会在空余部分用0补上,输出结果就是000000123
width和.prec:
对于number.number的使用,如
printf("%9.2f",123.0);
那就是输出长度为9,保留两位小数点的字符,输出结果为:
123.00
算上空格、数字、小数点 长度为9
对于*的使用,可以理解为如下:
星号使用的是下一个参数,如:
printf("%*d\n",6,123);
那么这个星号指的就是下一个参数6,然后%d仍然是123.
这对要求格式输出的时候很有用,尤其当我的参数是变量的时候
hlL 修饰符 表示修饰类型
hh → 把我要输出的东西当作单个字节来输出
h → 当作short输出
以此类推
(感觉用到的不多,编译器不同出现的结果也不同)
type总结
scanf的flag
对于跳过的使用,如下:
#include
int main(){
int num;
scanf("%*d%d",&num);
printf("%d\n",num);
return 0;
}
此时,输入123_456(_是空格),num跳过了123,读取到的是456,所以printf出来的就是456
scanf的type
对于scanf的%i,这个比%d更加灵活,举例如下:
int main(){
int num;
scanf("%i",&num);
printf("%d\n",num);
return 0;
}
如果我输入的是123,那么还是输出123,
如果我输入的是0x12,显然这是16进制,系统会自动将其转化成10进制输出,结果为18
如果我输入的是012,系统会辨认出这是8进制,将其转为10进制输出,结果为10
[…] 所允许的字符
如
上面是我要输入的东西,对于下方的scanf进行解释:
最开始出现的%*[^,] 我们读取的是$GPRMC,由于带星号,所以这是跳过接收,直到出现逗号为止(不包含这个逗号)
其次一个逗号,格式要求
再接下来的%[^,] 读取字符串,直到逗号为止,那就是读入了004319.00,后方代码以此类推。
scanf和printf的返回值
1.读入的项目(item)数
2.输出的字符数
int main(){
int i1,i2;
int num;
i1 = scanf("%d",&num);
i2 = printf("%d\n",num);
printf("%d:%d\n",i1,i2);
return 0;
}
输入1234,输出的i1,i2行是
1:5
1代表我读入的项目数是1(一个num)
5代表我输出的字符数是5(1、2、3、4、\n)
在要求严格的程序中,应该判断每次调用scanf或printf的返回值,从而了解程序运行中是否存在问题