C memset - 优雅地添加空终止符

3

我按照如何使用C的memset api添加空终止字符?的方法,添加了一个空终止符号。

这段代码有效了,由于添加了空终止符号,我不再让malloc的字符数组末尾产生奇怪的内存字符。

/* memset does not add a null terminator */
static void yd_vanilla_stars(size_t *number_of_chars, char *chars_to_pad)
{
    memset(chars_to_pad, 0, *number_of_chars+1);
    memset(chars_to_pad,'*',*number_of_chars);
}

有没有更优雅的方法来实现相同的功能?

2
如果您正在使用malloc()为数组分配内存,为什么不使用calloc()来获得零初始化的内存分配呢? - ad absurdum
2
@DavidBowling:没错,我也说了同样的话 - 我猜楼主不喜欢它。 - user2736738
感谢 @DavidBowling。Calloc 更加整洁。我可以删除这段代码。 - rustyMagnet
请不要将解决方案编辑到问题中。相反,您可以在答案框中发布答案,或接受已发布的答案。 - M.M
2个回答

8
你可以简单地这样做:

您可以简单地执行以下操作:

memset(chars_to_pad, '*', *number_of_chars);
chars_to_pad[*number_of_chars] = '\0';

另外,为什么number_of_chars是一个指针?

我试图在我的代码中遵循按引用传递的模式。你会为size_t或int按值传递吗? - rustyMagnet
1
@rustyMagnet 对于这样小的类型,传值不应该更慢,并且肯定更易读。相关链接:https://dev59.com/qHVC5IYBdhLWcg3whBaj#270435(它讨论了在C++中通过值传递与通过const引用传递的区别;通过指针传递应该更像是通过引用传递) - HolyBlackCat

2
该问题表明chars_to_pad指向使用malloc()分配的内存。另一种选择是使用calloc()。此函数会自动将分配的内存清零,因此无需在单独的步骤中将其清零。
示例可能如下所示:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    size_t arr_sz = 11;
    char *arr = calloc(arr_sz, sizeof *arr);
    memset(arr, '*', arr_sz - 1);

    puts(arr);

    return 0;
}

程序输出:

**********

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接