Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;函数类printf_C++_C - Fatal编程技术网

C++ c++;函数类printf

C++ c++;函数类printf,c++,c,C++,C,我有这个功能 char* copy(char* pString,...){ char *vToate; int vLen; va_list vAp; va_start(vAp,pString); vLen+=strlen(pString); va_end(vAp); vToate=new char[vLen+1]; va_list vAp1; va_start(vAp1,pString); strncpy(vTo

我有这个功能

char* copy(char* pString,...){
    char *vToate;
    int vLen;
    va_list vAp;
    va_start(vAp,pString);
    vLen+=strlen(pString);
    va_end(vAp);

    vToate=new char[vLen+1];

    va_list vAp1;
    va_start(vAp1,pString);
    strncpy(vToate,pString,strlen(pString));
    va_end(vAp1);
    return vToate;
}
如果我试试这个

char *vTest="test";
char *vTmp=copy(vTest," ",vTest);
cout<<vTmp;
char*vTest=“test”;
char*vTmp=copy(vTest,“,vTest);

cout临界线如下:

strncpy(vToate,pString,strlen(pString));
您正在将参数字符串的内容复制到输出字符串的开头。您需要为strncpy()指定一个指针,使其超过上一个副本的点,以便追加数据而不是覆盖数据

char* vCpy = vToate;
int len = 0;
va_list vAp1;
    va_start(vAp1,pString);
        len = strlen( pString );
        strncpy( vCpy, pString, len );
        vCpy += len;
va_end(vAp1);

上述注释也适用。

您似乎希望
va_start
/
va_end
对参数进行某种循环。事实并非如此,您需要自己进行迭代

但是变量函数并没有提供一种获得传递参数数量的方法,所以你也不能像现在这样安全地循环。您需要:

  • 更改第一个参数,使其指示要传递的参数数
  • 更改调用约定,以便始终传递
    NULL
    作为最后一个参数
这两种方法都很容易出错,需要在呼叫站点进行仔细的编码,这并不好

查看如何迭代参数的示例

您确实应该考虑使用<代码> STD::String < /Cord>S.他们有一个方便的

操作符+
,所以你不必做任何欺骗

如果你真的想以艰难的方式完成,请确保:

  • 初始化本地
    vLen
    参数
  • 使用
    strcat
    连接C样式的字符串(只要确实分配了足够的内存,就安全了,但不是这里最有效的)

    • 您错过的是一些循环,提取
      va_arg
      。此外,你不给你传递多少参数提示,你应该用“代码>空NU/CONDEX”或通过这个数字终止列表。< /P> < P>你所产生的不是真正的C++,但是在输出方面,你认为我相信:

      strncpy(vToate,pString,strlen(pString));
      
      只是获取pString(其中包含字符串“test”)并将其直接复制到vToate。因此,返回的是字符串“test”

      <> P>有多种方法将各种数据类型连接到C++中的单个字符串,但我发现最简单的方法是使用STD:String Struts:< /P>
      stringstream ss;
      ss << vTest << " " << vTest;
      char* vTmp = ss.str();
      cout << vTmp;
      
      stringstreamss;
      
      ss看来您不清楚如何使用可变宏。您忘记调用va_arg来获取下一个元素。您还需要一个length或sentinel值,以便知道何时不再有任何参数。看起来你想要这个:

      char *copy(char *str, ...)
      {
          va_arg ap;
          va_start(str, ap);
          int len = 0;
          char *sp;
          for(sp=str; sp; sp=va_arg(ap, char*))
              len+=strlen(sp);
          va_end(ap);
          va_start(ap);
          char *dst = new char[len+1];
          int pos = 0;        
          for(sp=str; sp; sp=va_arg(ap, char*)){
              memcpy(dst+pos, sp, strlen(sp));
              pos+=strlen(sp);
          }
          va_end(ap);
          dst[pos] = '\0';
          return dst;
      }
      
      然后你会称之为:

      char *str = copy("foo", " ", "bar", NULL);
      

      这与
      printf
      有什么共同之处?以及
      vLen
      的初始化在哪里?您对未初始化的值使用
      运算符+=
      ,或者这不是全部代码?您从未调用
      va_arg()
      来迭代参数列表。您也不会初始化
      vLen
      ,因此最终会使用
      newchar[]
      分配未定义的内存量。我很惊讶这个程序大部分时间都没有崩溃。