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,还不完善,到用到时再写吧,还应该有其他更简单的方法可以实现.
?
?
?
?
?