在一般coding时,会使用非常多的printf,格式化输出到命令行来显示,但如果有一天希望将格式化输出的内容不输出到命令行,而是保存到一个字符串string变量里,供其他代码使用。这时,最好的方式不是一个一个去修改printf,而是用下面的方式:
void functionA() { 。。。 printf( "%06x:", ((u1*)insns - pDexFile->baseAddr) + insnIdx*2); 。。。 printf(" %02x%02x", bytePtr[0], bytePtr[1]); 。。。 printf(" "); 。。。 brintf("|%04x: nop // spacer", insnIdx); 。。。 }
希望将上面的printf所有内容保存到变量std:string allInfo中,修改为:
std::string & std_string_format(std::string & _str, const char * _Format, ...) { std::string tmp; va_list marker = NULL; va_start(marker, _Format); size_t num_of_chars = _vscprintf(_Format, marker); if (num_of_chars >= tmp.capacity()) { tmp.resize(num_of_chars + 1); } vsprintf_s((char *)tmp.data(), tmp.capacity(), _Format, marker); va_end(marker); _str = tmp.c_str(); return _str; } void functionA() { #define PRINT(_FORMATE, ...) allInfo += std_string_format(info, _FORMATE, ##__VA_ARGS__);//printf("%s", info.c_str()); #define printf(_FORMATE, ...) PRINT(_FORMATE, ##__VA_ARGS__) std::string info,allInfo; 。。。 printf( "%06x:", ((u1*)insns - pDexFile->baseAddr) + insnIdx*2); 。。。 printf(" %02x%02x", bytePtr[0], bytePtr[1]); 。。。 printf(" "); 。。。 printf("|%04x: nop // spacer", insnIdx); 。。。 #undef printf }
什么都不用动,只要在functionA中加4行代码即可。前面2行宏和1行变量定义,后面1行undef,这样,就会将printf输出的所有内容保存到变量allInfo中。