Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-如何将char附加到char*?_C++_Char_Append - Fatal编程技术网

C++ C++;-如何将char附加到char*?

C++ C++;-如何将char附加到char*?,c++,char,append,C++,Char,Append,我在互联网上尝试过很多种方法,将字符附加到字符中,但似乎都不起作用。以下是我的一个不完整解决方案: 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,arr

我在互联网上尝试过很多种方法,将字符附加到字符中,但似乎都不起作用。以下是我的一个不完整解决方案:

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*ret
中隐藏外部
ret
if
块中的
char*ret
声明。因此,存在内存泄漏,另一方面,未为
ret
分配内存

要比较c样式字符串,应使用
strcmp(array,“”)
not
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[]
it在某处处理返回的
ret
的分配内存

你为什么不使用?它有
.append
方法在字符串末尾追加字符:

std::string str;

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

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

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

函数名不反映函数的语义。事实上,您没有附加字符。创建一个新的字符数组,该数组包含原始数组和给定字符。因此,如果您确实需要一个将字符附加到字符数组的函数,我将按照以下方式编写它

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

不能将
字符
附加到
字符*
;他们是两种截然不同的类型。您可以将
char
附加到
char*
所指向的数组中。请小心泄漏。如果不再需要新变量,则需要
删除[]
。或者最好使用
std::string
char ch = 't';
char chArray[2];
sprintf(chArray, "%c", ch);
char chOutput[10]="tes";
strcat(chOutput, chArray);
cout<<chOutput;
test