5

假设我想复制一个字符串,然后将一个值连接到它。

使用 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 中是否有更优雅的方法来做到这一点?

4

5 回答 5

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;
}
于 2012-09-25T21:18:10.230 回答
3

并不真地。C 根本没有像 C++ 那样好的字符串管理框架。使用malloc(),就像您所展示的那样strcpy()strcat()您可以尽可能接近您的要求。

于 2012-09-25T21:12:38.547 回答
3

GNU 扩展是asprintf()分配所需的缓冲区:

char* s2;
if (-1 != asprintf(&s2, "%s%s", "hello", "there")
{
    free(s2);
}
于 2012-09-25T21:26:07.917 回答
2

您可以使用像 GLib 这样的库,然后使用它的字符串类型

GString * g_string_append (GString *string, const gchar *val);

将一个字符串添加到 GString 的末尾,必要时扩展它。

于 2012-09-25T21:15:36.347 回答
1

受到nightcracker的启发,我也想到了

// 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 ;
}
于 2012-09-25T21:44:19.103 回答