C++ - 如何将一个字符附加到char*?

14

我在互联网上尝试了很多方法向char*添加字符,但是似乎没有一种方法可以成功。以下是我不完整的解决方案:

char* appendCharToCharArray(char * array, char a)
{
    char* ret = "";
    if (array!="") 
    {
        char * ret = new char[strlen(array) + 1 + 1]; // + 1 char + 1 for null;
        strcpy(ret,array);
    }
    else
    {
        ret = new char[2];
        strcpy(ret,array);
    }

    ret[strlen(array)] = a;  // (1)
    ret[strlen(array)+1] = '\0';
    return ret;
}

只有当传递的数组是""(内部为空)时,这才有效。否则就没有帮助(并在(1)处出错)。你们能帮我吗?非常感谢!


你不能将一个 char 追加到 char* 上;它们是两种非常不同的类型。但你可以将一个 char 追加到 char* 指向的 数组 中。 - Pete Becker
4个回答

16

移除那些在 if 块内部隐藏外部 retchar * ret 声明,否则会导致内存泄漏和未分配的内存。

要比较 C 风格字符串,应该使用 strcmp(array,"") 而不是 array!=""。你的最终代码应该像下面这样:

char* appendCharToCharArray(char* array, char a)
{
    size_t len = strlen(array);

    char* ret = new char[len+2];

    strcpy(ret, array);    
    ret[len] = a;
    ret[len+1] = '\0';

    return ret;
}
请注意,您必须通过delete[]处理返回的ret的分配内存。
为什么不使用std::string?它有.append方法在字符串末尾添加字符。
std::string str;

str.append('x');
// or
str += x;

2
小心内存泄漏。如果你不再需要它,你需要使用delete[]删除new的变量。或者更好的方法是使用std::string - impulse

3

函数名与函数的语义不符。事实上,你不是在追加一个字符,而是创建一个新的字符数组,该数组包含原始数组和给定的字符。因此,如果你确实需要一个将字符追加到字符数组的函数,我会按照以下方式编写它:

bool AppendCharToCharArray( char *array, size_t n, char c )
{
    size_t sz = std::strlen( array );

    if ( sz + 1 < n ) 
    {
        array[sz] = c;
        array[sz + 1] = '\0';
    }       

    return ( sz + 1 < n );
} 

如果您需要一个包含原始数组和给定字符的副本的函数,它可以如下所示:
char * CharArrayPlusChar( const char *array, char c )
{
    size_t sz = std::strlen( array );
    char *s = new char[sz + 2];

    std::strcpy( s, array );
    s[sz] = c;
    s[sz + 1] = '\0';

    return ( s );
} 

1
具体问题在于你声明了一个新变量,而不是给已有的变量赋值:
char * ret = new char[strlen(array) + 1 + 1];
^^^^^^ Remove this

尝试通过比较指针来比较字符串值:

if (array!="")     // Wrong - compares pointer with address of string literal
if (array[0] == 0) // Better - checks for empty string

尽管没有必要进行比较;无论字符串是否为空,第一个分支都会做正确的事情。
更一般的问题是,在C++中使用令人讨厌、容易出错的C风格字符串操作。使用std::string,它将为您管理所有内存分配:
std::string appendCharToString(std::string const & s, char a) {
    return s + a;
}

0
char ch = 't';
char chArray[2];
sprintf(chArray, "%c", ch);
char chOutput[10]="tes";
strcat(chOutput, chArray);
cout<<chOutput;

输出:

test

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接