假设我想复制一个字符串,然后将值连接到它。
使用stl std :: string,它是:
string s = "hello" ;
string s2 = s + " there" ; // effectively dup/cat
在C:
char* s = "hello" ;
char* s2 = strdup( s ) ;
strcat( s2, " there" ) ; // s2 is too short for this operation
我知道在C中执行此操作的唯一方法是:
char* s = "hello" ;
char* s2=(char*)malloc( strlen(s) + strlen( " there" ) + 1 ) ; // allocate enough space
strcpy( s2, s ) ;
strcat( s2, " there" ) ;
在C中有更优雅的方法吗?
答案 0 :(得分:4)
你可以制作一个:
char* strcat_copy(const char *str1, const char *str2) {
int str1_len, str2_len;
char *new_str;
/* null check */
str1_len = strlen(str1);
str2_len = strlen(str2);
new_str = malloc(str1_len + str2_len + 1);
/* null check */
memcpy(new_str, str1, str1_len);
memcpy(new_str + str1_len, str2, str2_len + 1);
return new_str;
}
答案 1 :(得分:3)
不是真的。 C根本没有像C ++那样的良好的字符串管理框架。使用malloc()
,strcpy()
和strcat()
就像您所展示的一样,尽可能接近您要求的内容。
答案 2 :(得分:2)
您可以使用像GLib这样的库,然后使用use its string type:
GString * g_string_append (GString *string, const gchar *val);
在GString的末尾添加一个字符串,必要时展开它。
答案 3 :(得分:2)
GNU扩展名为asprintf()
,用于分配所需的缓冲区:
char* s2;
if (-1 != asprintf(&s2, "%s%s", "hello", "there")
{
free(s2);
}
答案 4 :(得分:0)
受到夜间战士的启发,我也想到了
// writes s1 and s2 into a new string and returns it
char* catcpy( char* s1, char* s2 )
{
char* res = (char*)malloc( strlen(s1)+strlen(s2)+1 ) ;
// A:
sprintf( res, "%s%s", s1, s2 ) ;
return res ;
// OR B:
*res=0 ; // write the null terminator first
strcat( res, s1 ) ;
strcat( res, s2 ) ;
return res ;
}