1

我正在编写自己的追加函数,以使用静态字符缓冲区 [50] 在另一个字符串数组 1 的动态字符数组的末尾追加一个字符串数组 2 的动态字符数组。但是编译器会产生以下错误:[Error] incompatible types in assignment of 'char' to '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;
}
4

2 回答 2

3

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

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

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现在的结果。

于 2013-05-03T15:28:24.600 回答
1

您不能分配到数组中,这就是您在buffer=*a++. 你的意思可能是

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

另外,这里

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

您试图在数组开头之前取消一个元素的指针- 这会导致未定义的行为。

此外,您不会在任何地方检查字符串的长度,因此它很容易超过 49 个,并且您的代码将既不正确也不安全(容易成为缓冲区溢出攻击的受害者)。

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

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

于 2013-05-03T15:26:46.927 回答