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文件中:
- #ifndef _MYDEBUG_
- #define _MYDEBUG_
- #include "windows.h"
- #include "stdio.h"
- #include <stdarg.h>
- #include <string.h>
- class CMyDebug
- {
- protected:
- //要输出的字符缓冲区
- static char buf[10240];
- public:
- static void Print(const char* str,...)
- {
- int k=0;//str的索引
- int i=0;//buf的索引
- unsigned char c = *(str+k);
- va_list var;
- va_start(var,str);
- while(c!='\0')
- {
- unsigned char c1=*(str+k+1);
- if(c=='%')
- {
- if(c1=='c')//字符
- {
- char t = va_arg(var,char);
- buf[i++]=t;
- k+=2;
- }
- else if(c1=='d')//数字
- {
- int t = va_arg(var,int);
- char b[10];
- itoa(t,(char*)b,10);
- memcpy((void*)(buf+i),b,strlen((char*)b));
- i+=strlen((char*)b);
- k+=2;
- }
- else if(c1=='s')//字符串
- {
- char* t = va_arg(var,char*);
- int l = strlen(t);
- memcpy((void*)(buf+i),(const void*)t,l);
- i+=l;
- k+=2;
- }
- else
- {
- buf[i++]=c;
- k++;
- }
- }
- else
- {
- buf[i++]=c;
- k++;
- }
- c=*(str+k);
- }
- va_end(var);
- buf[i]=0;
- OutputDebugString((char*)buf);
- }
- };
- #endif
Debug.cpp文件中
- #include "Debug.h"
- char CMyDebug::buf[]={0};
使用:
- CMyDebug::Print("ddaaa=%c,str=%s\n",'t',"**sdfsfsdfsdfasf");
这个函数只能包含%c,%d,%s,还不完善,到用到时再写吧,还应该有其他更简单的方法可以实现.