c - 将字符附加到字符串末尾的函数

标签 c string realloc

根据我所阅读和理解的内容,例如,当我们将字符串传递给函数时,在该函数内部我们不能使用 sizeof( array )/sizeof( array[ 0 ] ) 来确定字符串的长度。所以我想知道这个将字符附加到字符串末尾的函数是否正确:

void append_ch_to_str( char *str, char ch )
{
    int length = strlen( str );

    str = ( char * )realloc( str, ( length + 1 ) * sizeof( char ) );

    length = strlen( str );

    *( str + length - 1 ) = '\0';
    *( str + length - 2 ) = ch;
}

最佳答案

不正确,但可以更正如下:

char *append_ch_to_str( char *str, char ch )
{
    int length = strlen( str );
    char *str2;

    str2 = ( char * )realloc( str, ( length + 2 ) * sizeof( char ) );
    if (!str2) {
        free(str);
        return NULL;
    }
    str = str2;

    str[length] = ch;
    str[length+1] = 0;

    return str;
}

所有这些都假设 str 指针指向已使用 malloc/calloc/strdup 分配的内存。

分配应为终止 0 字符提供空间,并为添加的字符再提供一个空间。

第二次计算字符串长度将具有相同的结果,因为它将计算非零字符,并且不会返回分配的缓冲区的大小。

如果内存不足,您必须检查 realloc 是否返回 NULL。编辑:我添加了对 realloc 返回值的检查 - 这将有望防止复制未完成的代码...

正如注释中指出的,这也是一种不好的方法,因为 realloc 不能保证返回相同的指针值,这就是为什么该函数将返回新的指针值,而原始指针值在执行后将不再有效。

关于c - 将字符附加到字符串末尾的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21654290/

相关文章:

c - void 指针 Realloc 的否定

c - initialize_main (&argc, &argv) 是做什么的?

c++ - 从一行中解析整数

c# - 尝试将字符串的第一个符号转换为 int,得到奇怪的值

python - 如何用模式拆分 2 列?

c - 为什么realloc似乎没有扩展内存。重新分配未按描述工作

c - 重新分配结构数组

C - 如何返回多个字符

c - 存在表中的键索引搜索

c - 如何使用循环展开和重新关联?