[英]C++ - How to append a char to char*?
我已经尝试过,可以在互联网上将角色附加到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)处得到错误)。 你能帮帮我吗? 非常感谢先进!
if
隐藏外部ret
块, if
删除内部的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;
函数名称不反映函数的语义。 实际上你不附加一个角色。 您创建一个包含原始数组和给定字符的新字符数组。 因此,如果您确实需要一个将字符附加到字符数组的函数,我将按以下方式编写它
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 * 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;
}
char ch = 't';
char chArray[2];
sprintf(chArray, "%c", ch);
char chOutput[10]="tes";
strcat(chOutput, chArray);
cout<<chOutput;
OUTPUT:
test
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.