请问如何重载int printf(const char* aStrToPrint, ...)才能让它把字符不要输出到屏幕而是字符串呢?
我觉得大概要用到sprintf,其实说穿了就是想在不改变现有代码的前提下吧对printf的呼叫都变成sprintf。。貌似那个...是不能传递的,难道我要用va_arg把每个printf里的参数都读出来然后再放到sprintf里吗?没有什么简单的办法吧“..."传递进sprintf?
谢谢了先

解决方案 »

  1.   

    int printf(const char* aStrToPrint, ...)
    {
    char buffer[1024];
    va_list args;
    va_start(args, aStrToPrint); return sprintf(buffer,aStrToPrint,args);
    }
    不知道这样对不对手边没编译器无法验证
      

  2.   

    int printf(const char* aStrToPrint, ...) 
    {
    sprintf(s, char* aStrToPrint, ...) ;
    }
      

  3.   

    刚编译了一下,发现用var_list传递会出错打印出乱码,
    比如
    printf("digit is %d", 10);
    等这个10作为var_list传递进我定义的printf时已经变成空的了,如果我打印自定义的printf中的buffer的话,会发现打印结果为 "digit is 1231456"...回2楼:能说的详细一些吗?
    回3楼:...不能直接作为参数传递。
      

  4.   

    sprintf ( buf           --------打印到buf
    fprintf( fp              ----------打印到 fp
      

  5.   

    int printf(const char* aStrToPrint, ...) 

    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());就没有任何问题。。
    谁知道这算怎么回事儿?
      

  6.   

    va_list 和 va_start,va_end要配合一起吧,
      

  7.   

    va_list 和 va_start,va_end要配合一起吧,
      

  8.   

    http://blog.csdn.net/xuzhihong_gdut/archive/2007/08/18/1749225.aspx
      

  9.   

    结贴了,,,我在第六楼发的那个printf已经可以完成任务了,至于为啥string无法打印这个就算我不重载printf那string也是无法打印出来的,%s只能对应char×。。
    至于说var_end要和var_start配对出现,我也不知道为什么,但是显然我没用var_end程序运行也是正确的,很多文章都说要一起用,但没人说为什么。。只在一个注释里看到说用var_end是为了重新初始化var_ap以其增加强壮性。