返回介绍

6.5.4 二维字符数组

发布于 2025-04-11 22:33:00 字数 2268 浏览 0 评论 0 收藏 0

通常只会在一个字符数组中存储一个字符串,如果有多个字符串,就得定义多个字符数组来进行存储。而更多时候,为了方便,会使用二维的字符数组来存储多个字符串,即用二维数组的一行存储一个字符串。

下面用一个案例介绍如何使用二维数组存储多个字符串。

例 6-4 】编写程序,由用户输入 3 个字符串,程序要求依据字符串的长度,以升序的方式打印输出所有字符串。

假设用户输入的字符串大小不会超过 128,可以定义如下的二维数组:

char strArr[3][128];

第一维大小为 3,表示可以存储 3 个字符串,第二维大小为 128,表示每个字符串的长度不会超过 127,因为要确保有一个位置给空字符,作为字符串的结束标记。

接着就可以很方便地用数组下标来将用户输入的字符串存储到二维数组的各行:

for(int i = 0; i < 3; ++i)
    gets(strArr[i]);

通过“strArr[i]”能获得二维数组中每一行的首元素的内存地址,例如:

将“strArr[0]”换成指针表示法就是“*(strArr + 0)”,结果为指向第一行首元素的指针;将“strArr[1]”换成指针表示法就是“*(strArr + 1)”,结果为指向第二行首元素的指针;将“strArr[2]”换成指针表示法就是“*(strArr + 2)”,结果为指向第三行首元素的指针。

获得用户输入的字符串后,就准备开始打印输出。案例要求按照字符串的长度进行升序方式打印,所以定义 3 个 int 类型变量分别存储 3 个字符串的长度,通过 strlen 函数分别获得用户输入的 3 个字符串的长度:

int a = strlen(strArr[0]);
int b = strlen(strArr[1]);
int c = strlen(strArr[2]);

由于只有 3 个字符串,所以这里不再采用对数组元素进行排序的方式,而是通过简单的条件运算符嵌套来完成打印输出。例如,想找出长度最短的字符串,可使用以下表达式:

a < b ? (a < c ? strArr[0] : strArr[2]) : (b < c ? strArr[1] : strArr[2])

如果“a < b”成立,则执行第一对小括号中所嵌套的条件表达式,否则执行第二对小括号中所嵌套的条件表达式。它的检测过程如下:

如果 a 小于 b,且 a 又小于 c,那么 a 就是最小的,所以将“strArr[0]”(第 1 个字符串)作为整个表达式的值。

如果 a 小于 b,且 a 又大于 c,那么 c 就是最小的,所以将“strArr[2]”(第 3 个字符串)作为整个表达式的值。

如果 b 小于 a,且 b 又小于 c,那么 b 就是最小的,所以将“strArr[1]”(第 2 个字符串)作为整个表达式的值。

如果 b 小于 a,且 b 又大于 c,那么 c 就是最小的,所以将“strArr[2]”(第 3 个字符串)作为整个表达式的值。

以同样的方式,可以得到字符串长度最大的那一个,嵌套的条件表达式如下:

a > b ? (a > c ? strArr[0] : strArr[2]) : (b > c ? strArr[1] : strArr[2])

稍微复杂一些的是得到长度处于中间位置的字符串,需要用到嵌套 3 层的条件表达式:

a < b ? (a > c ? strArr[0] : (b < c ? strArr[1] : strArr[2])) : (b > c ?
strArr[1] : (a < c ? strArr[0] : strArr[2]))

如此长的条件运算符的嵌套表达式比较复杂,也可以使用嵌套的 if…else 语句来完成,但是,最简洁的方式是使用条件运算符的嵌套。

程序的完整代码展示如下:

编译运行程序,结果如下:

Please enter three strings:
apple
orange
pear
Print the result:
pear
apple
orange

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。