C++字符串与字符数组

C++字符串与字符数组教程

C++ 中我们可以使用 字符数组 来代替字符串,但字符串与字符数组不是完全等价的。

C++字符串与字符数组区别

  • 在 C++ 中,字符串必须是以 \0 做为结尾的,但字符数组没有这个要求。

  • 字符串一定是一个 char 的数组,但 char 的数组未必是字符串。

  • 数字 0(和字符 ‘\0’ 等价)结尾的 char 数组 就是一个字符串,但如果 char 数组没有以数字 0 结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的 char 数组。

C++字符串与字符数组对比详解

指定长度

char arr[8] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'};

这里,我们指定了数组的长度,但数组的长度正好跟后面初始化的元素个数相等,因此,此时不会自动在最后增加 \0 结尾,因此,这里的 arr 变量 是一个字符数组,而不是字符串,现在,我们修改如下:

char arr[9] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'};

此时,我们定义的 arr 变量的长度比后面初始化字符的个数多了一个,此时,会自动在最后增加了 \0,此时的 arr 是一个字符串。

不指定数组长度

char arr[] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'};

这里,我们没有指定数组的长度,且没有以 \0 结尾,因此,这里的 arr 变量是一个字符数组,而不是字符串,现在,我们修改如下:

char arr[] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r', '\0'};

我们在最后增加了 \0,此时的 arr 是一个字符串。

字符串遇0自动结束

char arr[] = "Hai\0Coder";

如果我们以字符串输出变量 arr,那么只会输出 “Hai”,因此,以字符串输出遇到 \0 会自动结束,如果使用字符数组输出,则会全部输出。

案例

指定字符数组长度

定义一个字符数组,指定其长度

#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "嗨客网(www.haicoder.net)\n" << endl; // 定义字符数组 char arr[8] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'}; cout << "arr = " << arr << endl; return 0; }

程序运行后,控制台输出如下:

37_C字符串与字符数组区别.png

我们定义了一个字符数组变量 arr,有八个元素,并且我们接着赋值了八个字符,最后,我们使用 cout 打印该字符数组变量。

此时,我们看到,输出最后多了一个乱码,这是因为,字符串必须要以 ‘\0’ 结尾, 但我们这里没有,因此,我们将程序修改如下:

#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "嗨客网(www.haicoder.net)\n" << endl; // 定义字符数组 char arr[9] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'}; cout << "arr = " << arr << endl; return 0; }

程序运行后,控制台输出如下:

38_C字符串与字符数组区别.png

这次,我们将字符数组的长度增加了一,此时,我们定义的数组的长度比我们赋值的元素个数多一,此时,编译器会自动在字符数组后面加上 ‘\0’ 字符,这次,我们再输出该字符串,我们发现此时字符串正常输出了。

不指定字符数组长度

定义一个字符数组,不指定其长度

#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "嗨客网(www.haicoder.net)\n" << endl; // 定义数组数组 char arr[] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'}; cout << "arr = " << arr << endl; return 0; }

程序运行后,控制台输出如下:

39_C字符串与字符数组区别.png

我们定义了一个字符数组变量 arr,我们没有指定其长度,同时,元素赋值没有增加 \0 ,最后,我们使用 cout 打印该字符数组变量。

此时,我们看到,输出最后多了一个乱码,这是因为,字符串必须要以 ‘\0’ 结尾, 但我们这里没有,因此,我们将程序修改如下:

#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "嗨客网(www.haicoder.net)\n" << endl; // 定义字符串 char arr[] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r', '\0'}; cout << "arr = " << arr << endl; return 0; }

程序运行后,控制台输出如下:

40_C字符串与字符数组区别.png

这次,我们定义字符数组时,没有指定长度,但我们手动在最后增加了 \0,这次,我们再输出该字符串,我们发现此时字符串正常输出了。

字符串遇0自动结束

定义一个字符数组,中间包含 \0

#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "嗨客网(www.haicoder.net)\n" << endl; // 定义数组数组 char arr[] = {'H', 'a', 'i', '\0', 'C', 'o', 'd', 'e', 'r'}; for(int i = 0; i < 9; i++) { cout << arr[i]; } cout << endl; return 0; }

程序运行后,控制台输出如下:

41_C字符串与字符数组区别.png

我们定义的字符数组变量 arr,其中包含了 \0 元素,我们使用 for 循环 遍历它,我们看到,可以输出所有的字符,现在我们将程序修改如下:

#include <iostream> using namespace std; int main(int argc, char **argv) { cout << "嗨客网(www.haicoder.net)\n" << endl; // 定义字符数组 char arr[] = {'H', 'a', 'i', '\0', 'C', 'o', 'd', 'e', 'r'}; cout << "Arr = " << arr << endl; return 0; }

程序运行后,控制台输出如下:

42_C字符串与字符数组区别.png

这次,我们以字符串的格式输出此字符数组,我们发现,只输出了前三个字符,因为,以字符串输出字符数组时,遇到 \0 会自动结束。

C++字符串与字符数组区别总结

在 C++ 中,字符串必须是以 \0 做为结尾的,但字符数组没有这个要求。字符串一定是一个 char 的数组,但 char 的数组未必是字符串。

数字 0(和字符 ‘\0’ 等价)结尾的 char 数组就是一个字符串,但如果 char 数组没有以数字 0 结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的 char 数组。