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[]
分配未定义的内存量。我很惊讶这个程序大部分时间都没有崩溃。