初始化 char 数组以保存非 null 终止的字符串

Initialize char array to hold non-null-terminated string

我正在尝试用一个长字符串初始化一个 char 数组。但是,我不希望它被 NULL 终止。

这个:

const char s[] = "The actual string is much longer then this...";

比这个更容易阅读(和编写):

const char s[] = {'T', 'h', 'e', ' ', 'a', 'c', 't', 'u', 'a', 'l', ' ', 's', ...};

但前者被 NULL 终止。有没有办法避免字符串文字上的 NULL

这样做的原因是需要在开发过程中已知的固定大小长度的内存中密集打包字符串。

我会做:

size_t length = 45;
char s[] = "The actual string is much longer then this..";
s[length - 1] = ".";

看看你有什么在可读性和功能之间进行权衡,我认为你可以轻松解决这个问题,因为你可以 not 避免 NULL 终止字符串在"normal"初始化中。


如果我处在你的位置,我会重新考虑我的方法并使用 std::string

没有。如果您想轻松编写代码,请复制到第二个数组但错过最后一个字符。您可以在第一种情况下使用 char 指针来节省一些内存

没有.

字符串文字是一个 C 字符串,根据定义,它以 null 结尾。

要么忽略最后一个字符,重新审视你的要求(你为什么关心最后一个字符?!)或者......我不知道,别的。也许 generate the objects with xxd?

如果不合适,终止的 nul 将被省略。由于您的字符串都是固定长度的,因此安排起来不是问题。例如:

#include <stdio.h>

char foo[3][4] = { "four", ".by." , "3333" };

int main(void)
{
    for (int i = 0; i < 3; ++i)
    {
         for (int j = 0; j < 4; ++j)
             putchar(foo[i][j]);
         putchar('\n');
    }
}

没有办法让字符串文字不是空终止的。

但您实际上想要密集打包多个字符串,并且您在开发时就知道大小和字符串。

假设:

"First"

"Second"

"Third"

打包它们你可以安全地做:

char const s[] = "First""Second""Third";

如果要打印或使用标准字符串,您只需要保存长度并正确重建终止。不过这很容易。

作为奖励,您已经从必须为每个需要的字符串存储的多余指针中节省下来。