我的追加功能无法按预期工作。 C ++

时间:2013-05-03 15:22:23

标签: c++ arrays function dynamic append

我正在编写自己的append函数,使用静态char缓冲区[50]在字符串array1的另一个动态字符数组的末尾追加字符串array2的动态字符数组。但编译器会生成以下错误:[错误]将'char'赋值为'char [50]'时出现不兼容的类型。我试图弄清楚问题,但我似乎没有找到解决方案。非常感谢您的帮助。我正在使用Dev-C ++。代码如下:

#include <iostream>


using namespace std;

char *Appendstring(char *a, char *b)  // will append b to the end of a
{
    static char buffer[50];
    char *p=buffer=*a++;  //[Error] incompatible types in assignment of 'char' to 'char[50]'
                    //[Error] invalid conversion from 'char*' to 'char'[-fpermissive]
    p--;
    while(*p++=b++);
    p--;  //append
    while(*p++=*c++);
    return buffer;  


}

int main ()
{

    string str="Displaying: ";
    string add=" Summer is coming";

    Appendstring(str, add);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

你的追加函数有多个错误,最大的错误是使用数组作为指针并使用静态缓冲区来合并字符串。使用静态缓冲区,所有合并的字符串将位于相同的空间中,因此合并两个字符串然后合并另外两个字符串将覆盖第一次合并的结果!

您可以按如下方式更改您的功能:

char *Appendstring(const char *a, const char *b)  // will append b to the end of a
{
    char *buffer = new char[strlen(a)+strlen(b)+1];
    char *p=buffer;
    while(*p++=*a++); // Copy a into buffer
    while(*p++=*b++); // Copy b into buffer right after a
    *p=0; // Null-terminate the string
    return buffer;  
}

当然,来电者有责任现在释放Appendstring的结果。

答案 1 :(得分:1)

您无法分配到数组中,这是您在buffer=*a++中执行的操作。你的意思可能是

static char buffer[50];
char *p=buffer;
*p=*a++;

此外,这里

p--;
while(*p++=*b++);

你试图在数组的开头之前对一个元素进行反驳 - 这会导致未定义的行为。

此外,你无处检查字符串的长度,因此它可以很容易地与49一起,你的代码将是错误和不安全的(buffer overflow攻击的容易受害者)。

最后一个问题是,由于使用了static数组,您的代码在任何方面都是不可重入的。您可以简单地使用简单数组,如果您不想将其调整为字符串的长度,或者动态分配它,如此处所示。

当然,最好的解决方案是使用std::string并忘记所有这些问题。