printf
——功能:格式输出,是C语言中产生格式化输出的函数(定义在stdio.h中),用于向终端(显示器、控制台等)输出字符
——原型:int printf(const char *format, ...)
——说明:
%d,%u 十进制有/无符号整数
%x,%X 十六进制无符号整数小/大写
%c,%s 字符型/字符串
%f,%e,%E 浮点数/指数形式表示的浮点数
%g,%G 根据数值不同自动选择%f或%e
%o 八进制无符号整数
%p 指针
——例:
%3d — 输出3位整型数,不足3位右对齐,数字表示最大占宽
%03d — 输出3位整型数,不足3位在前面用“0”补足
%-3d — 输出3位整型数,不足3位左对齐,“-”表示左对齐
%9.2f — 输出9位浮点数,小数2位,整数6位,小数点占一位,不足9位右对齐
%m.ns — n个字符输出在m列范围,不足用空格补位;若n>m,则自动取n值,保证n个字符正常输出
printf("%*.*s", m, n, str) — 两个*分别对应参数m,n,同上
l,h — l对整型指long型,对实型指double型;h用于将整型的格式字符修正为short型
# — 对c、s、d、u类无影响,对o类输出时加前缀0,对x类输出时加前缀0x,对e、g、f类当结果有小数时才给出小数位
%%,\n,\r,\t,\xhh — 百分号/换行/回车/TAB符/一个ASCII码用十六进制表示
sprintf
——功能:字符串格式化命令,把格式化的数据写入某个字符串中
——原型:int sprintf(char *buffer, const char *format, ...)
——说明:注意接收串长度大小,以防缓冲区溢出;其是变参函数,除了前面两个参数外后面的参数都不是类型安全,无法通过格式串得知函数调用前参数压栈时压进的参数类 型,导致参数压栈时可能会做符号扩展;其返回值是函数调用写入缓冲区中的字符数目。
——例:
short s = -1; sprintf(str, "%04X", s); —得到str为“FFFFFFFF”,无法通过格式串得知函数调用前参数压栈时压进的是4字节整数还是2字节短整数,所以采用统一字节的处 理方式,导致参数压栈时做了符号扩展。可改为sprintf(str, "%04X", (unsigned short)s)或定义unsigned short s = -1;
snprintf
——功能:字符串格式化命令,把格式化的数据写入某个字符串中
——原型:int snprintf(char *str, size_t size, const char *format, ...)
——说明:最多从源串拷贝size-1个字符到目标串中,然后再在后面加一个‘\0’;成功返回欲写入的字符串长度,出错则返回负值。
Windows版本下面有类似的_snprintf代替snprintf,但是有区别:
If len < count, then len characters are stored in buffer, a null-terminator is appended, and len is returned.
If len = count, then len characters are stored in buffer, no null-terminator is appended, and len is returned.
If len > count, then count characters are stored in buffer, no null-terminator is appended, and a negative value is returned.
可如下使用:
char sa[256]={0};
int result = _snprintf(sa,sizeof(sa),"%s",sb);
if(result==sizeof(sa) || result<0)
{
printf("warning:sting will be truncated");
sa[sizeof(sa)-1]=0;
}