C++ 字符数组,\0

C++ 字符数组,\0,c++,arrays,char,C++,Arrays,Char,我知道,如果将字符数组与希望使用\0的函数(如cout)一起使用,则必须使用字符数组末尾的\0,否则会出现意外的随机字符 我的问题是,如果我只在My函数中使用字符数组,逐字符读取,是否需要在末尾存储\0 另外,只填充字符并在数组上留下洞是一个好主意吗 考虑以下几点: char chars[5]; chars[1] = 15; chars[2] = 17; chars[3] = 'c'; //code using the chars[1] and chars[3], but never usi

我知道,如果将字符数组与希望使用
\0
的函数(如cout)一起使用,则必须使用字符数组末尾的
\0
,否则会出现意外的随机字符

我的问题是,如果我只在My函数中使用字符数组,逐字符读取,是否需要在末尾存储
\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;
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';
}
chars[5];
字符[1]=15;
字符[2]=17;
字符[3]='c';
//使用字符[1]和字符[3]编码,但从不使用字符
int y=字符[1]+字符[3];

cout在我看来,数组似乎不是用于字符串,而是作为数字数组使用,因此可以不在数组中使用
'\0'

既然您正在使用它来存储数字,请考虑使用<代码> UT88YT 或<代码> IT88T 类型,从<代码> Stdit.H./C> >,这是<代码>无符号char < /代码>和<代码>符号char < /代码>,但更清楚地表明,该数组被用作一个数字数组,而不是字符串。


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


至于不包括它,因为你不需要它,当然。字符数组必须有一个终止的
\0

字符数组末尾存储尾随字符(0)的约定有一个名称,称为“C字符串”。它与char无关,特别是,如果您使用的是宽字符,则宽C字符串将以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';
}
生成与相同的数组

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;
它们不一样
one
的整数值为1,而
ascicharone
的整数值为1


最后:如果您确实希望存储整数数值,而不是它们的字符表示形式,那么您可能需要查看中的C++11固定宽度整数类型。对于8位无符号值uint8\u t,对于8位有符号值,int8\u t

1。你不需要,但这是个好主意。特别是如果其他人正在使用您的字符串,并希望在最后有一个
\0
。例如,
basic_string
不保证以null结尾。2.数组中没有孔,
chars
中的每个元素在构造时都被初始化为
char(0)
\0
仅与-style字符数组相关。您的代码应该是安全的,,@0x499602D2
chars
如果是局部变量,则不会被“\0”初始化为POD类型。@nyrl您说得对,我的错。谢谢,如果我使用数组来存储字符和小于128的数字,以保存ram(而不是int),可以吗,只要您不将该数组传递给一个期望以null结尾的c字符串的函数。另外,我脑海中突然出现了另一个问题:如果我比较两个以这种方式生成的字符数组,会发生什么?您不能使用strcmp,因为它期望以null结尾的c字符串。但是,同样,您可以使用这些数组,因为它们是int数组。
char
是特定于实现的(在unsigned上签名)
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';