c++输出调试信息到vs中的输出窗口

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进制输出格式?

发布了30 篇原创文章 · 获赞 3 · 访问量 898

猜你喜欢

转载自blog.csdn.net/qq_42697866/article/details/103618372
今日推荐