OutputDebugString函数
OutputDebugString(L"字符串");(VS中,#define OutputDebugString OutputDebugStringW )
OutputDebugStringW(L"字符串");
OutputDebugStringA(“字符串”);
sprintf、swprintf、wsprintf、sprintf_s、snprintf、asprintf、vsprintf函数
sprintf、swprintf函数:将格式化数据写入字符串缓冲区中
int sprintf(char* buffer,const char* format [,argument] … );返回值为存储在buffer中的字节(bytes)的数目,不包含终止空字符
int swprintf(wchar_t buffer,const wchar_t format [,**argument] … );返回值为存储在buffer中的宽字符的数目,不包含终止空宽字符
buffer-指向将要写入的字符串的缓冲区
format-格式控制字符串
[argument]…-可选参数,可以是任何类型的数据(使用此函数可将数字转为字符串)
格式化规定符:
- %d 格式化为十进制有符号整数输出到缓冲区
- %u 格式化为十进制无符号整数输出到缓冲区
- %f 格式化为浮点数输出到缓冲区
- %s 格式化为字符串输出到缓冲区
- %c 格式化为单个字符输出到缓冲区
- %e 格式化为指数形式的浮点数输出到缓冲区
- %x 格式化为无符号以十六进制表示的整数(a-f小写输出)输出到缓冲区
- %X 格式化为无符号以十六进制表示的整数(a-f大写输出)输出到缓冲区
- %0 格式化为无符号以八进制表示的整数输出到缓冲区
- %g 格式化为自动选择合适的表示法输出到缓冲区
- 说明:
可以在"%“和字母之间插进数字表示最大场宽。例如: %3d 表示输出3位整型数,不够3位右对齐。%9.2f 表示输出场宽为9的浮点数,其中小数位为2,整数位为6,小数点占一位,不够9位右对齐。%8s 表示输出8个字符的字符串,不够8个字符右对齐。如果字符串的长度、或整型数位数超过说明的场宽,将按其实际长度输出。但对浮点数,若整数部分位数超过了说明的整数位宽度,将按实际整数位输出;若小数部分位数超过了说明的小数位宽度,则按说明的宽度以四舍五入输出。另外,若想在输出值前加一些0,就应在场宽项前加个0。例如:
%04d 表示在输出一个小于4位的数值时,将在前面补0使其总宽度为4位。如果用浮点数表示字符或整型量的输出格式,小数点后的数字代表最大宽度,小数点前的数字代表最小宽度。例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9,则第9个字符以后的内容将被删除。可以在”%“和字母之间加小写字母l,表示输出的是长型数。例如: %ld 表示输出long整数,%lf 表示输出double浮点数。 可以控制输出左对齐或右对齐,即在”%“和字母之间加入一个”-" 号可说明输出为左对齐,否则为右对齐。例如: %-7d 表示输出7位整数左对齐。%-10s 表示输出10个字符左对齐。
wsprintf函数:将一系列的字符和数值输入到字符串缓冲区。wsprintf其实分为 wsprintfA 和 wsprintfW。VS中,#define wsprintf wsprintfW
int __cdecl wsprintf(LPWSTR lpOut,LPCWSTR lpFmt,…);
wsprintf的输出缓冲区lpOut有 1024 字符限制,而且不支持浮点数的输入输出。
swprintf(FPSString, L"%f", FPS); //正确
wsprintf(FPSString, L"%f", FPS); //错误("%f")
sprintf_s函数:是sprintf的安全版本,指定缓冲区长度来避免sprintf()存在的溢出风险,主要差在sprintf_s第二个参数,可以控制缓冲区大小
int sprintf_s(char * buffer,size_t sizeofBuffer,const char *format, [argument] …);
sizeOfBuffer-缓冲区大小。
snprintf函数:
int snprintf(char *str, size_t size, const char *format, …);
size 的作用就是限制往str写入不超过size个字节(包括了结尾的’/0’)。
如果输出因为size的限制而被截断,返回值将是“如果有足够空间存储,所 应 能输出的字符数(不包括字符串结尾的’/0’)”,这个值和size相等或者比size大!也就是说,如果可以写入的字符串是 “0123456789ABCDEF” 共16位,但是size限制了是10,这样 snprintf() 的返回值将会是16 而不是 10 !
asprintf函数:
int asprintf(char * *strp, const char *fmt, …);
asprintf()可以说是一个增强版的sprintf(),在不确定字符串的长度时,非常灵活方便,能够根据格式化的字符串长度,申请足够的内存空间。此外,使用完后,必须通过free()释放空间。不过,这是GNU扩展的C函数库,不是标准C函数库或者POSIX。
vsprintf函数:
int vsprintf(char *string, char *format, va_list param);
vsprintf()函数中的自变量是位于数组中的,数组元素的字符串之前都要加上百分号(%)。这个函数是“一步一步[step-by-step]”按顺序执行。在第一个%后,将插入第一个数组元素;在第二个%后,将插入第二个数组元素,依次类推。
使用举例
C++输出16进制char数组到VS中的输出窗口。
char nSelectsat[6];
nSelectsat[5] = 0x60;
nSelectsat[4] = 0x11;
nSelectsat[3] = 0x90;
nSelectsat[2] = 0x88;
nSelectsat[1] = 0x80;
nSelectsat[0] = 0x8a;
//直接输出数组名
char out0[128] = { 0 };
sprintf(out0, "%x\r", nSelectsat);
OutputDebugStringA(out0);//4fe7bc(nSelectsat数组地址)
//直接输出*数组名
char out00[128] = { 0 };
sprintf(out00, "%x\r", *nSelectsat);
OutputDebugStringA(out00);//ffffff8a(nSelectsat[0])
//循环依次输出数组元素
char out8[128] = { 0 };
for (int i = 0; i < 6; i++)
{
sprintf(out8, "%x", nSelectsat[i]);
OutputDebugStringA(out8);
}//ffffff8affffff80ffffff88ffffff901160
//数组元素先转换为无符号类型 (unsigned char),再输出
//原因(参考8):%mx, 之类的格式输出,输出宽度不够,忽略输出宽度,直接全部输出。在输出前,转换为无符号类型,可以避免这种问题。
//所有较短整型,在调用 printf 之类的输出流函数的时候,会转换为int 类型,
//而 char 类型缺省实现,并不是 unsigned char,通常是 signed char;
//转化为int 的时候,会做符号位扩展
char out9[128] = { 0 };
for (int i = 0; i < 6; i++)
{
sprintf(out9, "%x", (unsigned char)nSelectsat[i]);
OutputDebugStringA(out9);
}//8a8088901160
参考
1、OutputDebugString函数
2、sprintf, swprintf 微软
3、c++数据类型转换 sprintf、swprintf、wsprintf
4、wsprintf
5、c++中sprintf和sprintf_s的区别
6、sprintf、snprintf、asprintf、vsprintf函数
7、整理:C++中sprintf()函数的使用详解
8、字符数组用printf函数16进制输出格式?