C语言字符串与字符数组

C语言字符串与字符数组教程

C 语言 中没有单独的 字符串 类型,字符串使用的是 字符数组 来代替的,但字符串与字符数组不是完全等价的。

C语言字符串与字符数组区别

  • 在 C 语言中,字符串必须是以 \0 做为结尾的,但字符数组没有这个要求。
  • 字符串一定是一个 char 的数组,但 char 的数组未必是字符串。
  • 数字 0(和字符 ‘\0’ 等价)结尾的 char 数组 就是一个字符串,但如果 char 数组没有以数字 0 结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的 char 数组。
  • 在使用 printf 打印字符串时,我们使用 “%s” 格式控制符,在打印字符时,我们使用 “%c” 格式控制符。

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 <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); // 定义字符数组 char arr[8] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'}; printf("%s\n", arr); return 0; }

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

38_c语言字符串与字符数组区别.png

我们定义了一个字符数组变量 arr,有八个元素,并且我们接着赋值了八个字符,最后,我们在使用 printf 打印该字符数组变量时,使用了 “%s”,即以字符串形式打印该变量。

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

#include <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); // 定义字符串 char arr[9] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'}; printf("str = %s\n", arr); return 0; }

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

39_c语言字符串与字符数组区别.png

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

不指定字符数组长度

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

#include <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); // 定义字符数组 char arr[] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r'}; printf("%s\n", arr); return 0; }

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

40_c语言字符串与字符数组区别.png

我们定义了一个字符数组变量 arr,我们没有指定其长度,同时,元素赋值没有增加 \0 ,最后,我们在使用 printf 打印该字符数组变量时,使用了 “%s”,即以字符串形式打印该变量。

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

#include <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); // 定义字符串 char arr[] = {'H', 'a', 'i', 'C', 'o', 'd', 'e', 'r', '\0'}; printf("str = %s\n", arr); return 0; }

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

41_c语言字符串与字符数组区别.png

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

字符串遇0自动结束

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

#include <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); // 定义字符数组 char arr[] = {'H', 'a', 'i', '\0', 'C', 'o', 'd', 'e', 'r'}; int i = 0; for(i = 0; i < 9; i++) { printf("%c", arr[i]); } printf("\n"); return 0; }

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

42_c语言字符串与字符数组区别.png

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

#include <stdio.h> int main() { printf("嗨客网(www.haicoder.net)\n\n"); // 定义字符数组 char arr[] = {'H', 'a', 'i', '\0', 'C', 'o', 'd', 'e', 'r'}; printf("Arr = %s\n", arr); return 0; }

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

43_c语言字符串与字符数组区别.png

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

C语言字符串与字符数组区别总结

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

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

在使用 printf 打印字符串时,我们使用 “%s” 格式控制符,在打印字符时,我们使用 “%c” 格式控制符。