我在c ++中使用char数组并编写了这个程序:
int main()
{
char text[] = { 'h', 'e', 'l', 'l', 'o' }; //arrays initialised like this
//will have a size of the number
//of elements that you see
char text2[] = "hello"; //arrays initialised like this will have a size of
//the number of elements that you see + 1 (0 on the
//end to show where the end is
cout << endl;
cout << "The size of the first array is: " << sizeof(text) << endl;
cout << endl;
for (int i = 0; i < sizeof(text); i++)
{
cout << i << ":" << text[i] << endl;
}
cout << endl;
cout << "The size of the first array is: " << sizeof(text2) << endl;
cout << endl;
for (int i = 0; i < sizeof(text2); i++)
{
cout << i << ":" << text2[i] << endl;
}
cout << endl;
cin.get();
return 0;
}
这个程序给了我输出:
The size of the first array is: 5
0:h
1:e
2:l
3:l
4:o
The size of the first array is: 6
0:h
1:e
2:l
3:l
4:o
5:
我的问题是:是否有一个特殊的原因,与使用字符串文字初始化char数组不同,初始化具有单独字符的char数组最终不会有空终止符(0)?
答案 0 :(得分:4)
花括号初始化程序只为数组提供指定的值(或者如果数组较大,则其余项目是默认值)。即使项目为char
值,它也不是字符串。 char
只是最小的整数类型。
字符串文字表示零终止的值序列。
就是这样。
答案 1 :(得分:1)
非正式地,它是"foo"
形式的字符串文字中的第二个引号字符,它添加了NUL终止符。
在C ++中,"foo"
是const char[4]
类型,在某些情况下将衰减到const char*
。
这就是语言的运作方式,就是这样。它非常有用,因为它与所有标准库函数很好地吻合,这些函数将字符串建模为指向NUL终止的char
s数组中第一个元素的指针。
使用像char text[] = { 'h', 'e', 'l', 'l', 'o' };
这样的额外元素进行拼接会使真的烦恼,并且可能会在语言中引入不一致。你会为signed char
和unsigned char
做同样的事情吗?那么int8_t
呢?
答案 2 :(得分:1)
是否有一个特殊原因,使用单独的字符初始化char数组将不具有空终止符(0)
原因是因为语法......
Type name[] = { comma separated list };
...用于初始化任何类型的 。不只是char
。
"quoted string"
语法是一种非常特定类型的数组的简写,它假设需要一个空终止符。
答案 3 :(得分:0)
您可以通过多种方式自行终止:
char text1[6] = { 'h', 'e', 'l', 'l', 'o' };
char text2[sizeof "hello"] = { 'h', 'e', 'l', 'l', 'o' };
char text3[] = "hello"; // <--- my personal favourite
答案 4 :(得分:0)
当你指定一个双引号分隔的相邻字符集(一个字符串文字)时,假设你想要的是一个字符串。 C中的字符串表示以空值终止的字符数组,因为它对字符串(printf
,strcpy
等)的函数有所期待。因此,编译器会自动为您添加该null终止符。
当您提供以逗号分隔的逗号分隔的单引号分隔字符列表时,假定您不想要字符串,但您想要一个您指定的确切字符的数组。所以没有添加空终止符。
C ++继承了这种行为。
答案 5 :(得分:0)
一个字符串文字,比如这个"hello"
有一个常量字符数组的类型,并按以下方式初始化
const char string_literal_hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
正如所见,字符串文字的类型是const char[6]
。它包含六个字符。
因此这个宣言
char text2[] = "hello";
也可以写成
char text2[] = { "hello" };
实际上取代了以下声明
char text2[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
然后,字符串文字用作字符数组的初始值设定项,其所有字符都用于初始化数组。