将所有printf输出到内存变量中。printf转string

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


猜你喜欢

转载自blog.csdn.net/a33445621/article/details/69557238