我正在尝试使用长字符串初始化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
?
这样做的原因是需要在开发过程中已知的固定大小长度的内存中打包密集的字符串。
答案 0 :(得分:4)
否强>
字符串文字是一个C字符串,根据定义,它是以NULL结尾的。
要么忽略最后一个角色,重新审视你的要求(你为什么关心最后一个角色?!)或者......我不知道,还有其他什么。也许是generate the objects with xxd
?
答案 1 :(得分:1)
我愿意:
size_t length = 45;
char s[] = "The actual string is much longer then this..";
s[length - 1] = ".";
看看你有什么在可读性和功能之间进行权衡,我认为你可以轻松逃脱,因为你可以不避免“正常”中的NULL终止字符串初始化。
如果我在你的鞋子里,我会重新考虑我的方法并使用std::string。
答案 2 :(得分:1)
如果终止nul不合适,将省略终止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');
}
}
答案 3 :(得分:0)
没有。如果你想让essy编写代码,请复制到第二个数组但是错过了最后一个字符。您可以在第一种情况下使用char指针来节省一些内存
答案 4 :(得分:0)
没有办法让字符串文字没有空终止。
但是你实际上想要密集地打包一些字符串,并且你知道开发时的大小和字符串。
假设:
&#34;首先&#34;
&#34;第二&#34;
&#34;第三&#34;
打包它们你可以安全地做到:
char const s[] = "First""Second""Third";
您只需要保存长度并正确重建终止,以防您想要打印或使用标准字符串。这很容易。
作为奖励,你已经从多余的指针中保存了你需要存储的每个字符串所需的字符串。