请问如何重载int printf(const char* aStrToPrint, ...)才能让它把字符不要输出到屏幕而是字符串呢?
我觉得大概要用到sprintf,其实说穿了就是想在不改变现有代码的前提下吧对printf的呼叫都变成sprintf。。貌似那个...是不能传递的,难道我要用va_arg把每个printf里的参数都读出来然后再放到sprintf里吗?没有什么简单的办法吧“..."传递进sprintf?
谢谢了先
我觉得大概要用到sprintf,其实说穿了就是想在不改变现有代码的前提下吧对printf的呼叫都变成sprintf。。貌似那个...是不能传递的,难道我要用va_arg把每个printf里的参数都读出来然后再放到sprintf里吗?没有什么简单的办法吧“..."传递进sprintf?
谢谢了先
{
char buffer[1024];
va_list args;
va_start(args, aStrToPrint); return sprintf(buffer,aStrToPrint,args);
}
不知道这样对不对手边没编译器无法验证
{
sprintf(s, char* aStrToPrint, ...) ;
}
比如
printf("digit is %d", 10);
等这个10作为var_list传递进我定义的printf时已经变成空的了,如果我打印自定义的printf中的buffer的话,会发现打印结果为 "digit is 1231456"...回2楼:能说的详细一些吗?
回3楼:...不能直接作为参数传递。
fprintf( fp ----------打印到 fp
{
char buffer[1024];
va_list args;
va_start(args, aStrToPrint); vsprintf(buffer,aStrToPrint,args);
logCollection.push_back(string(buffer));
}logCollection是一个vector<string>,这样定义printf就能把本该打印在屏幕上的东西存在这个vector里,但这样写还是有bug,大部字符串都是正确的,但下面这个情况就会出错:
string filePath = "c:\\windows";
printf("file path %s :", filePath);
这个时候经过自定义printf后,输出的字符串中完全没有了filePath的信息,但如果改成
string filePath = "c:\\windows";
printf("file path %s :", filePath.c_str());就没有任何问题。。
谁知道这算怎么回事儿?
至于说var_end要和var_start配对出现,我也不知道为什么,但是显然我没用var_end程序运行也是正确的,很多文章都说要一起用,但没人说为什么。。只在一个注释里看到说用var_end是为了重新初始化var_ap以其增加强壮性。