我为字符数组初始化执行以下操作:
char a[] = "teststring";
char b[]={'a','a','b','b','a'};
对于第一个,如果我需要获取字符串长度,我必须strlen(a)
....对于我应该做的另一个字符串sizeof(b)/sizeof(b[0])
。
为什么会出现这种差异?
编辑:(我知道了)char name[10]="StudyTonight"; //valid character array initialization
char name[10]={'L','e','s','s','o','n','s','\0'}; //valid initialization
请记住,当您通过列出所有字符分别初始化字符数组时,您必须明确提供'\ 0'字符。
我用char b得到它,我们必须添加'\ 0'来进行正确的初始化。
另一个: 因此,可以使用以下两个语句之一使用以null结尾的字符序列来初始化名为myword的char元素数组:
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword[] = "Hello";
答案 0 :(得分:6)
字符串文字,如"teststring"
,包含双引号之间的字符,以及值为零的终止char
。所以
char a[] = "ab";
与;
具有相同的效果char a[] = {'a', 'b', '\0'};
strlen()
搜索值为'\0'
的字符。因此,strlen(a)
在这种情况下将返回2.
相反,sizeof()
获取所用内存的实际大小。由于sizeof(char)
为1,因此根据标准中的定义,这意味着sizeof(a)
会给出3
的值 - 它会计算'a'
,'b'
和'\0'
。
答案 1 :(得分:5)
a
是一个C风格的字符串,即以null结尾的char数组。初始化等同于:
char a[] = {'t','e','s','t','s','t','r','i','n','g','\0'};
但是, b
不是以null结尾的,所以它不是C风格的字符串,你不能使用像std::strlen()
这样的函数,因为它们只对C风格的字符串有效。 / p>
答案 2 :(得分:2)
字符串文字扩展为char数组,但也包括终止零字符。所以想想
char a[] = "teststring";
好像你有类型
char a[] = {'t','e','s','t','s','t','r','i','n','g','\0'};
每当您在char数组上使用 strlen()
时,使用字符串文字进行初始化。 strlen
函数可以被认为是一个简单的扫描终止零char(\0
)计算所需的迭代。
即使有时与括号一起使用,sizeof
也是一个运算符,是C ++语言的一个组成部分(从C次继承)。在char c[] = "hello";
之类的情况下,sizeof(c)
将返回6,这正好比strlen(c)
多1,您可能会想:"让我们跳过针对终结符的低效扫描&#34 ;但是sizeof
会停止这样的"高效"只要它在指针上运行,并且数组可以(并且将)在需要时用作指针。请看以下示例:
#include <iostream>
// naive approach, don't do that
int myarraysize(char s[])
{
return sizeof(s);
}
int main ()
{
char c[] = "hello";
std::cout << sizeof(c) << " vs " << myarraysize(c) << std::endl;
return 0;
}
答案 3 :(得分:2)
你总是可以写
char b[]={'a','a','b','b','a','\0'};
克服“差异”。
另请注意
sizeof(b)/sizeof(b[0])
基本归结为
sizeof(b)
因为sizeof(char)
始终为1.您的公式用于任何其他数组元素类型。