以类似于初始化字符串文字的方式初始化char数组

时间:2010-07-09 20:51:11

标签: c++ string arrays initialization literals

假设我已经跟随char数组的初始化:

char charArray[]={'h','e','l','l','o',' ','w','o','r','l','d'};

我还有一个字符串文字的初始化:

char stringLiteral[]="hello world";

第一个数组和第二个字符串的内容之间的唯一区别是第二个字符串的末尾有一个空字符。

当初始化一个char数组的问题时,是否有一个宏或某些东西允许我们将初始化文本放在两个双引号之间但是数组没有得到额外的空终止字符?

对我来说没有意义的是,当不需要终止空字符时,我们应该使用首先提到的初始化的语法,并为初始化文本中的每个字符写两个单引号,以及virgule标记到单独的字符。

我应该补充一点,当我想要一个char数组时,我也不应该明白我不想将它用于依赖字符串文字的函数以及使用字符串文字的功能都没有结果,是我的考虑。

我很感谢你的答案。

5 个答案:

答案 0 :(得分:6)

允许在C中声明数组如下,这将初始化它而不复制终止'\0'

char c[3] = "foo";

但它在C ++中是非法的。我不知道一个允许它用于C ++的技巧。 C ++标准进一步说

基本原理:当这些非终止数组被标准字符串例程操纵时,可能会发生重大灾难。
对原始功能的影响:删除语义明确的功能。
转换难度:语义转换。必须将数组声明为一个更大的元素,以包含终止'\ 0'的字符串 广泛使用:很少。这种数组初始化风格被视为编码风格较差。

答案 1 :(得分:3)

没有办法做你想做的事。初始化数组的第一种方法是为每个字符指定单独的初始值设定项,这允许明确地省略'\ 0'。第二个是从字符串初始化字符数组,在C / C ++中总是以空字符结束。

编辑:更正:'字符指针' - > 'character array'

答案 2 :(得分:1)

litb has the technically correct answer

至于一个观点 - 我说只是附加'\ 0'的'浪费'。如此多的错误是代码期望终止null的结果,其中一个不是(这个建议似乎直接反对我在一两天前提出的关于不打扰整个缓冲区的一些其他建议。我声称没有矛盾 - 我仍然主张null终止缓冲区中的字符串。)

如果由于你正在处理的数据结构中的某些语义而无法使用'\ 0'终结符,例如它可能是某些较大的压缩结构的一部分,你总是可以自己初始化数组(我认为应该没有编译器可能为你做的那么有效):

#define MY_STRING_LITERAL "hello world"

char stringLiteral[sizeof(MY_STRING_LITERAL) - 1];

memcpy( stringLiteral, MY_STRING_LITERAL, sizeof(stringLiteral));

答案 3 :(得分:0)

基本答案是绝大多数char数组都是字符串 - 在C中,字符串是空终止的。 C ++继承了这种约定。即使不需要null,大多数情况下只要把它留在那里也不成问题。

宏不够强大,无法做到你想要的。模板将是,但它们没有任何编译时字符串处理。

通常,当人们想要在同一个char数组序列中混合使用数字字节和字符串文字时,他们会使用字符串文字但使用十六进制字符转义符,例如\xFF

答案 4 :(得分:0)

我可能已经找到了一种方法来做我想要的但是它不是我想要的,但它可能具有相同的效果。
首先考虑以下两个类:

template <size_t size>
class Cont{
 public:
  char charArray[size];
};
template <size_t size>
class ArrayToUse{
 public:
  Cont<size> container;
  inline ArrayToUse(const Cont<size+1> & input):container(reinterpret_cast<const Cont<size> &>(input)){}
};

在继续之前,您可能想要 here 并查看常量表达式构造函数和初始化类型。
现在看下面的代码:

const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;

最后,初始化文本写在两个双引号之间。