首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符数组,\0

字符数组,\0
EN

Stack Overflow用户
提问于 2013-12-08 23:34:58
回答 3查看 5.7K关注 0票数 4

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

我的问题是,如果我只在函数中使用字符数组,逐字符读取字符数组,那么是否需要在最后存储\0

另外,只填充字符并在数组上留下洞是个好主意吗?

请考虑以下几点:

代码语言:javascript
复制
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;

上面的代码是否存在意外错误的风险?

EDIT:编辑了这个示例.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-08 23:50:54

在一个字符数组的末尾存储一个尾随字符(0)的约定有一个名称,它被称为'C字符串‘。具体而言,它与char无关--如果您使用的是宽字符,那么宽C字符串将以wchar_t(0)结尾。

所以,如果您使用的只是一个字符数组,而不是一个C字符串,那么使用char数组而不是尾随零是绝对可以的。

代码语言:javascript
复制
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。

代码语言:javascript
复制
char x[] = { 'a', 'b', 'c', '\0' };

生成与

代码语言:javascript
复制
char x[] = { 'a', 'b', 'c', 0 };

不过,你的第二个问题还不清楚

代码语言:javascript
复制
//code using the chars[1] and chars[3], but never using the chars
int y = chars[1]+chars[3];
cout << chars[3] << " is " << y;

只要您确信您的代码知道它们是未初始化的,留下空白就可以了。如果不是,则考虑以下几点:

代码语言:javascript
复制
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';
}

请记住:

代码语言:javascript
复制
char one = 1;
char asciiCharOne = '1';

都不一样了。one的整数值为1,而asciiCharOne的整数值为整数值49

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

票数 3
EN

Stack Overflow用户

发布于 2013-12-08 23:36:49

在我看来,您使用的不是字符串数组,而是数字数组,所以可以不在数组中使用'\0'

由于您使用它来存储数字,请考虑使用uint8_tstdint.h中的int8_t类型,它们是用于unsigned charsigned char的类型,但更清楚的是,数组被用作数字数组,而不是字符串。

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

编辑:,我知道这不是你的问题,但既然我们在这里,用char代替int来做数字,可能是骗人的。在大多数架构中,它并没有提高性能,但实际上减慢了性能。这主要是因为内存是可寻址的,而且处理器以任何方式处理4字节/8字节操作数。唯一的好处是存储的大小,但是使用它来存储在磁盘上,除非您正在处理非常大的数组,或者是有限的ram,否则也可以使用int来处理ram。

票数 2
EN

Stack Overflow用户

发布于 2013-12-08 23:37:53

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

因为你不需要,所以不包括在内,当然。没有什么神奇的东西可以说明一个char数组必须有一个终止的\0

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20460656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档