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

Posted

技术标签:

【中文标题】C memset - 优雅地添加一个空终止符【英文标题】:C memset - elegantly add a null terminator 【发布时间】:2018-02-10 14:26:12 【问题描述】:

我在使用 C memset api 时按照How to memset char array with null terminating character? 添加了一个空终止符。

代码有效;由于空终止符,我不再将奇数的内存字符添加到我的 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);

有没有更优雅的方式来达到同样的效果?

【问题讨论】:

如果您使用malloc() 为您的数组分配,为什么不使用calloc() 来获得零初始化分配? @DavidBowling.:是的,我也说了同样的话——我猜 OP 不喜欢它。 感谢@DavidBowling。 Calloc 更整洁。我可以删除此代码。 请不要在问题中编辑解决方案。相反,您可以在“答案”框中发布答案,或接受已发布的答案 【参考方案1】:

你可以这样做:

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

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

【讨论】:

我试图在我的代码中遵循通过引用传递的模式。你会为 size_t 或 int 传递值吗? @rustyMagnet 对于这样的小类型,按值传递不应该更慢,而且肯定更具可读性。相关:***.com/a/270435/2752075(它讨论了在 C++ 中按值传递与按 const 引用传递;按指针传递应该或多或少类似于按引用传递)【参考方案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;

程序输出:

**********

【讨论】:

以上是关于C memset - 优雅地添加一个空终止符的主要内容,如果未能解决你的问题,请参考以下文章

C++ char 数组空终止符位置

使用 strlen 时如何不为空终止符添加 +1 会导致使用 send 时发送额外的垃圾字节 [关闭]

哪些语言标准允许忽略固定大小数组上的空终止符?

通过 PAnsiChar (char *) 传递 AnsiString 是不是明确需要空终止符?

c语言中函数memset()是啥意思?啥功能

如何用 ProcessPoolExecutor 优雅地终止 loop.run_in_executor?