【问题标题】:C++ - How to append a char to char*?C ++ - 如何将char附加到char *?
【发布时间】:2013-11-22 09:43:34
【问题描述】:

我已经尝试过互联网上将字符附加到 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* 指向的数组

标签: c++ char append


【解决方案1】:

删除if 块内隐藏外部ret 的那些char * ret 声明。因此,您有内存泄漏,另一方面,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;

【讨论】:

  • 小心泄漏。如果您不再需要它,您需要 delete[] 新变量。或者更好地使用std::string
【解决方案2】:

具体问题是您声明了一个新变量而不是分配给现有变量:

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

【讨论】:

    【解决方案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 );
    } 
    

    【讨论】:

      【解决方案4】:
      char ch = 't';
      char chArray[2];
      sprintf(chArray, "%c", ch);
      char chOutput[10]="tes";
      strcat(chOutput, chArray);
      cout<<chOutput;
      

      输出:

      test
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-08
        • 2012-07-05
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多