5. 字符串数组

在 C 语言中,可以如何实现一个数组来保存多个字符串?这时我们会用到字符串数组

字符串数组的实现方式有两种:

  1. 使用字符型二维数组;
  2. 使用字符型指针数组。

1、 字符型二维数组

使用字符型二维数组 可以组成一个字符串数组,例如:

char strs[][20] = {"first line!", "second line!"};

由于二维数组中的每个数据元素都是等长度的一维数组,如果有些字符串比较长,有些比较短,则会大量的浪费内存空间。

char strs[][20] = {"a", "second line!!!!!!!"};

第一行只有一个 "a" 其它的内存空间都是字符零('\0')。

示例:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char strs[][20] = {"a", "second line!!!!!!!"};
    int i;

    for (i = 0; i < sizeof(strs)/sizeof(strs[0]); i++) {
        printf("strs[%d]: %s\n", i, strs[i]);
    }
    return 0;
}

运行结果如下:

strs[0]: a
strs[1]: second line!!!!!!!

使用二维数组存储字符型数组的优点是可以任意修改每一行数据的内容。缺点是可能浪费存储空间,不适合长短不一的字符串的存储。

2、字符型指针数组

在存储多个字符串时,如果字符串是字面值或者动态内存分配(后面会讲)的存储空间的字符串,则可以使用 字符型指针数组 来存储这些字符串。

字符型指针数组的声明方式如下:

const char* strs[] = {"first line!", "second line!"};

数组中每一个数据元素都是一个 const char * 类型的指针,分别指向不同字符串字面值的起始地址。这样我们就可以通过指针来访问每一个字符串了。

示例:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    const char* strs[] = {"first line!", "second line!"};
    int i;

    for (i = 0; i < sizeof(strs)/sizeof(strs[0]); i++) {
        printf("strs[%d]: %s\n", i, strs[i]);
    }
    return 0;
}

运行结果如下:

strs[0]: first line!
strs[1]: second line!

实验

使用二维数组存储多行字符串。要求从键盘读取多行字符串,保存在二维数组中。然后打印所有你输入的字符串。然后打印你输入的字符串的总长度。