字符数组,\ 0

时间:2013-12-08 23:34:58

标签: c++ arrays char

我知道,如果你使用带有期望\0的函数的字符数组(如cout),字符数组末尾的\0是必须的,否则会出现意外的随机字符。

我的问题是,如果我只在 我的 函数中使用字符数组,通过char读取char,我是否需要将\0存储在结束?

另外,最好只填充字符并在数组上留下空洞吗?

请考虑以下事项:

char chars[5];

chars[1] = 15;
chars[2] = 17;
chars[3] = 'c';

//code using the chars[1] and chars[3], but never using the chars
int y = chars[1]+chars[3];
cout << chars[3] << " is " << y;

上述代码是否存在意外错误?

编辑 :编辑了示例。

3 个答案:

答案 0 :(得分:3)

在字符数组的末尾存储尾随字符(0)的约定有一个名称,它被称为“C字符串”。它没有任何关系,特别是与char - 如果你使用宽字符,宽字符串将以wchar_t(0)终止。

因此,如果您使用的字符只是一个字符数组而不是C字符串,那么使用不带尾随零的字符数组是绝对正常的。

char dirs[4] = { 'n', 's', 'e', 'w' };
for (size_t i = 0; i < 4; ++i) {
    fprintf(stderr, "dir %d = %c\n", i, dirs[i]);
    std::cout << "dir " << i << " = " << dirs[i] << '\n';
}

注意'\ 0'是char(0),即它的数字,整数值为0。

char x[] = { 'a', 'b', 'c', '\0' };

生成与

相同的数组
char x[] = { 'a', 'b', 'c', 0 };

你的第二个问题不清楚,但

//code using the chars[1] and chars[3], but never using the chars
int y = chars[1]+chars[3];
cout << chars[3] << " is " << y;

只要您确定您的代码知道它们未初始化,就可以保留差距。如果不是,请考虑以下事项:

char chars[4]; // I don't initialize this.
chars[1] = '1';
chars[3] = '5';
int y = chars[1] + chars[3];
std::cout << "y = " << y << '\n';
// prints 100, because y is an int and '1' is 49 and '5' is 51

// later
for (size_t i = 0; i < sizeof(chars); ++i) {
    std::cout << "chars[" << i << "] = " << chars[i] << '\n';
}

记住:

char one = 1;
char asciiCharOne = '1';

不一样。 one的整数值为1,而asciiCharOne的整数值为integer value of 49

最后:如果您真的想要存储整数数值而不是它们的字符表示,您可能需要查看中的C ++ 11固定宽度整数类型。对于8位无符号值uint8_t,对于8位有符号值,int8_t

答案 1 :(得分:2)

对我来说,看起来你不是将数组用于字符串,而是作为数组的数组,所以是的,可以不在数组中使用'\0'

由于您使用它来存储数字,请考虑使用uint8_t中的int8_tstdint.h类型,这些类型是unsigned charsigned char的typedef,但是这种方式更清晰,数组用作数字数组,而不是字符串。

cout << chars[3] << " is " << y;不是未定义的行为,因为你从数组访问位置3的元素,该元素在数组中并且是一个char,所以一切都很好。

修改 另外,我知道这不在你的问题中,但由于我们在这里,使用char而不是int来表示数字,可能是骗人的。在大多数体系结构中,它不会提高性能,但实际上会降低性能。这主要是因为内存可寻址的方式,并且因为处理器无论如何都使用4字节/ 8字节操作数。唯一的好处是存储大小,但是使用它来存储在磁盘上,除非你使用的是非常大的数组,或者使用有限的ram,否则也可以使用int作为ram。

答案 2 :(得分:2)

运行字符数组的末尾,因为它没有终止\0意味着访问不属于该数组的内存。这会产生未定义的行为。通常这看起来像随机字符,但这是一个相当良性的症状;有些人更糟糕。

至于不包括它,因为你不需要它,当然。没有任何魔法可以说char数组必须有一个终止\0