繁体   English   中英

c ++函数就像printf一样

[英]c++ function like printf

我有这个功能

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;

结果是“测试”而不是“测试”有什么错?

看起来你希望va_start / va_end对参数进行一种循环。 事实并非如此,您需要自己进行迭代。

但是可变参数函数无法提供获取传递的参数数量的方法,因此您也无法以安全的方式进行循环。 你需要:

  • 更改第一个参数,使其指示您传递的参数数量。
  • 更改调用约定,以便始终将NULL作为最后一个参数传递。

两者都容易出错,并且需要在呼叫站点进行仔细编码,这并不是很好。

在这里查看如何迭代参数的示例。

您应该真正考虑使用std::string 他们有一个方便的operator+ ,所以你不必做任何这样的诡计。

如果你确实想要这么做,请确保:

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

关键是这一条:

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_arg 此外,您没有提供有关您传递的参数数量的提示,您应该使用NULL终止列表或传递数字。

你所产生的并不是真正的C ++,但就你所看到的输出而言,我相信:

strncpy(vToate,pString,strlen(pString));

只是采用pString(包含字符串“test”)并将其直接复制到vToate。 所以你返回的是字符串“test”。

在C ++中,有多种方法可以将各种数据类型连接为单个字符串,但是我发现最简单的一种方法是使用std:stringstream:

stringstream ss;
ss << vTest << " " << vTest;
char* vTmp = ss.str();
cout << vTmp;

看起来你不清楚如何使用可变参数宏。 你忘了调用va_arg来获取每个下一个元素。 您还需要一个长度或标记值,这样您就可以知道何时没有任何参数。 看来您想要这样:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM