- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套if语句
- C - switch 语句
- C - 嵌套switch语句
- C语言中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值传递函数
- C - 按引用传递函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void 指针
- C - 野指针
- C - 解引用指针
- C - 近指针、远指针和巨指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或枚举类型)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入和输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- C - 指令
- C - 预处理运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的字符串数组
在C编程语言中,字符串是由NULL终止的字符序列数组,它是一维字符数组。并且,字符串数组是字符串(字符数组)的数组。
什么是C语言中的字符串数组?
因此,可以将字符串数组定义为 –
字符串数组是一个二维字符类型数组,其中每个字符数组(字符串)都以空字符结尾。
要声明一个字符串,我们使用以下语句 –
char string[] = {'H', 'e', 'l', 'l', 'o', '\0'}; Or char string = "Hello";
声明和初始化字符串数组
要声明一个字符串数组,您需要声明一个二维字符数组,其中第一个下标是字符串的总数,第二个下标是每个字符串的最大大小。
要初始化一个字符串数组,您需要在双引号内提供多个字符串,并用逗号分隔。
语法
要构造一个字符串数组,使用以下语法 –
char strings [no_of_strings] [max_size_of_each_string];
示例
让我们声明并初始化一个字符串数组,以存储10种计算机语言的名称,每种语言的最大长度为15个字符。
char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" };
打印字符串数组
可以使用printf() 函数和%s格式说明符来打印字符串。要打印字符串数组中的每个字符串,您可以使用for循环直到字符串的数量。
示例
在以下示例中,我们正在声明、初始化和打印一个字符串数组 –
#include <stdio.h> int main (){ char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; for (int i = 0; i < 10; i++){ printf("%s\n", langs[i]); } return 0; }
输出
运行此代码时,将产生以下输出 –
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
注意:每个字符串的大小不等于数组声明中的行大小。"\0"符号表示字符串的终止,并且行中剩余的单元格为空。因此,分配给数组的大部分内存未被使用,从而浪费了内存。
字符串数组如何在内存中存储?
我们知道每个char类型在内存中占用1个字节。因此,此数组将分配一个150字节的块。虽然此块是连续的内存位置,但每组15个字节构成一行。
假设数组位于内存地址1000,则此数组的逻辑布局可以如下所示 –
使用指针的字符串数组
为了更有效地使用内存,我们可以使用指针。而不是二维字符数组,我们声明一个“char *”类型的1D数组。
char *langs[10] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" };
在二维字符数组中,字符串占用150个字节。与此相反,在指针数组中,字符串占用的字节数要少得多,因为每个字符串都随机分配了内存,如下所示 –
注意:这里,lang[ ]是指向各个字符串的指针数组。
示例
我们可以使用如下for循环来打印字符串数组 –
#include <stdio.h> int main(){ char *langs[10] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; for (int i = 0; i < 10; i++) printf("%s\n", langs[i]); return 0; }
输出
运行此代码时,将产生以下输出 –
PYTHON JAVASCRIPT PHP NODE JS HTML KOTLIN C++ REACT JS RUST VBSCRIPT
这里,langs是指向10个字符串数组的指针。因此,如果langs[0]指向地址5000,则"langs + 1"将指向地址5004,该地址存储指向第二个字符串的指针。
因此,我们还可以使用循环的以下变体来打印字符串数组 –
for(int i = 0; i < 10; i++){ printf("%s\n", *(langs + i)); }
当字符串存储在数组中时,有很多用例。让我们研究一些用例。
查找长度最大的字符串
在以下示例中,我们将第一个字符串的长度及其位置(即“0”)分别存储在变量“l”和“p”中。在for循环中,每当找到长度更大的字符串时,我们都会更新这些变量。
示例
请查看以下示例 –
#include <stdio.h> #include <string.h> int main (){ char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; int l = strlen(langs[0]); int p = 0; for (int i = 0; i < 10; i++){ if (strlen(langs[i]) >= l){ l = strlen(langs[i]); p = i; } } printf("Language with the longest name: %s Length: %d", langs[p], l); return 0; }
输出
运行此代码时,将产生以下输出 –
Language with longest name: JAVASCRIPT Length: 10
按升序对字符串数组进行排序
我们需要使用strcmp() 函数来比较两个字符串。如果字符串比较的值大于0,则表示第一个参数字符串在字母顺序上出现在第二个参数字符串之后。然后,我们使用strcmp()函数交换这两个字符串。
示例
请查看以下示例 –
#include <stdio.h> #include <string.h> int main (){ char langs [10][15] = { "PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML", "KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT" }; int i, j; char temp[15]; for (i = 0; i < 9; i++){ for (j = i + 1; j < 10; j++){ if (strcmp(langs[i], langs[j]) > 0){ strcpy(temp, langs[i]); strcpy(langs[i], langs[j]); strcpy(langs[j], temp); } } } for (i = 0; i < 10; i++){ printf("%s\n", langs[i]); } return 0; }
输出
运行此代码时,将产生以下输出 –
C++ HTML JAVASCRIPT KOTLIN NODE JS PHP PYTHON REACT JS RUST VBSCRIPT
在本章中,我们解释了如何声明字符串数组以及如何在字符串函数的帮助下操作它。