自己实现的Win32程序中的printf

本文介绍如何在Win32程序中实现类似C语言console模式下的printf功能,通过自定义函数结合va_list等宏,实现在调试器中的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言console模式中有printf函数非常方便, 但在win32程序中的输出就有点麻烦了,用MessageBox,AfxMessageBox这些函数输出都不好,总是要点确定,我们可以用OutputDebugString函数输出到调式器中,如dbgview.再结合一些字符串的函数就可以当printf使用了,但还是不够方便.如使用时还得申请空间.于是就自己写了个printf

 

要使用的宏:

va_list: 声明一个可变参数集

va_arg( va_list arg_ptr, type );//从arg_ptr中取得一个类型为type的数据

void va_end( va_list arg_ptr );//结束

void va_start( va_list arg_ptr, prev_param );  //开始解析arg_ptr

 

 

Debug.h文件中:

Cpp代码  收藏代码
  1. #ifndef _MYDEBUG_  
  2. #define _MYDEBUG_  
  3. #include "windows.h"  
  4. #include "stdio.h"  
  5. #include <stdarg.h>  
  6. #include <string.h>  
  7.   
  8. class CMyDebug  
  9. {  
  10. protected:  
  11.     //要输出的字符缓冲区  
  12.     static char buf[10240];  
  13. public:  
  14.     static void Print(const char* str,...)  
  15.     {  
  16.         int k=0;//str的索引  
  17.         int i=0;//buf的索引  
  18.         unsigned char c = *(str+k);  
  19.         va_list var;  
  20.         va_start(var,str);  
  21.         while(c!='\0')  
  22.         {  
  23.             unsigned char c1=*(str+k+1);  
  24.             if(c=='%')  
  25.             {  
  26.                 if(c1=='c')//字符  
  27.                 {  
  28.                     char t = va_arg(var,char);  
  29.                     buf[i++]=t;  
  30.                     k+=2;  
  31.                 }  
  32.                 else if(c1=='d')//数字  
  33.                 {  
  34.                     int t = va_arg(var,int);  
  35.                     char b[10];  
  36.                     itoa(t,(char*)b,10);  
  37.                     memcpy((void*)(buf+i),b,strlen((char*)b));  
  38.                     i+=strlen((char*)b);  
  39.                     k+=2;  
  40.                 }  
  41.                 else if(c1=='s')//字符串  
  42.                 {  
  43.                     char* t = va_arg(var,char*);  
  44.                     int l = strlen(t);  
  45.                     memcpy((void*)(buf+i),(const void*)t,l);  
  46.                     i+=l;  
  47.                     k+=2;  
  48.                 }  
  49.                 else  
  50.                 {  
  51.                     buf[i++]=c;  
  52.                     k++;  
  53.                 }  
  54.             }  
  55.             else  
  56.             {  
  57.                 buf[i++]=c;  
  58.                 k++;  
  59.             }  
  60.             c=*(str+k);  
  61.         }  
  62.         va_end(var);  
  63.         buf[i]=0;  
  64.         OutputDebugString((char*)buf);  
  65.     }  
  66. };  
  67. #endif  

 

Debug.cpp文件中

 

Cpp代码  收藏代码
  1. #include "Debug.h"  
  2. char CMyDebug::buf[]={0};  

 

 

使用:

Cpp代码  收藏代码
  1. CMyDebug::Print("ddaaa=%c,str=%s\n",'t',"**sdfsfsdfsdfasf");  

 

 

这个函数只能包含%c,%d,%s,还不完善,到用到时再写吧,还应该有其他更简单的方法可以实现.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值