服务端相关 / 37 C 语言中的字符串

C 语言中的字符串

在前面 C 语言的变量类型中介绍过 C 语言中的变量类型。不知道大家有没有注意到,在 C 语言中有字符类型的变量,但是没有其他编程语言中经常出现的字符串类型,在 JAVA 或者 C# 中用 string 这个关键字来声明其类型。但是在 C 语言中是没有这个变量类型的。

1. 字符串

在 C 语言中定义的字符串是一个由字符组成的数组,这个数组的最后一个元素是一个表示空的字符 \0

字符串 abcde 在 C 语言中的存储方式如下

char str[]="abcde";
--------------------------
| a | b | c | d | e | \0 |
--------------------------
  0   1   2   3   4   5    索引

2. 字符串的声明

因为字符串是由字符串数组存储的,所以字符串的声明就是声明了一个字符串数组。方式如下:

char str[6];

3. 字符串的初始化

字符串的初始化可以直接使用双引号的方式,也可以遵循数组初始化的方式,但是,有一点特别。就是在使用单个字符逐个赋值的时候,最后一个元素一定是 \0 ,而且最需要注意的是,数组的容量一定要比你实际存储的字符的数量多一,因为你要用最后一位来存储 \0

char a[] = "We are family.";
char b[5] = "abcd";
char c[5] = {'a', 'b', 'c', 'd', '\0'}; // 请注意这个初始化方式,和之前的数组初始化方式一致。

4. 字符串的使用

字符串的使用中,可以通过双引号包围字符的方式直接给它赋值,但是请注意这个时候你可能不知道数组的大小,可能会造成数组的溢出错误,也就是你的赋值超出了数组可以存储的最大的字符的数量。因为字符串本身是通过字符数组来实现的,因此,数组的使用方式在这里是可以使用的。比如你可以访问字符串中的某一个字符,或者更改其中的某一个字符,只要通过其索引位置就可以了, str[9] = 'a';

5. 示例

#include <stdio.h>

int main()
{
    char a[5];
    char b[] = "abcde";
    char c[6] = {'a', 'b', 'c', 'd', 'e', '\0'};

    a[0] = 'H';
    a[1] = 'e';
    a[2] = 'l';
    a[3] = 'l';
    a[4] = '\0';

    printf("a = %s\n", a);

    for (int i = 0; i < 5; i++)
    {
        printf("a[%d] = %c\n", i, a[i]);
    }

    for (int i = 0; i < 6; i++)
    {
        printf("b[%d] = %c\n", i, b[i]);
    }

    printf("c = %s\n", c);

    return 0;
}

运行结果:

a = Hell
a[0] = H
a[1] = e
a[2] = l
a[3] = l
a[4] =
b[0] = a
b[1] = b
b[2] = c
b[3] = d
b[4] = e
b[5] =
c = abcde

示例程序里展示了单独声明字符串 a ,并且在后面为其赋值,初始化变量 bc。接着,我们通过屏幕打印语句查看了字符串的内容,并且通过循环语句,输出了字符数组中存储的字符串。

字符串在 C 语言中是不安全存在的,请大家切记如果不是在初始化的时候用双引号的形式赋值,在使用数组赋值的时候,请大家一定不要忘记末尾的结束符号。如果缺少了这个符号,大家可以尝试看看,看看内存使用错误的奇妙。

6. 小结

字符串在 C 语言中的处理与其他语言相比是比较特殊的。在 C 语言中没有专门的字符串的变量类型。而是通过字符数组的方式来实现字符串的功能。这使得字符串具有了数组的全部特性。但是与其它类型的数组最大的一点区别就是存储字符串的数组的最后一位是 \0 ,表示的是空,这点可以用来检测一个字符串是不是已经到了末尾。