printf、sprintf、snprintf简述

来源:互联网 发布:丽升网络评卷系统 编辑:程序博客网 时间:2024/05/17 23:36

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;

}


0 0