在一般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中。