字符串数组的表示形式

在C语言中字符串数组有两种表示方法:

  • 第一种,二维字符数组

可以利用二维字符数组来表示字符串,格式是:char strs[row][col];。例如:

char strs[4][6] = {"hello", "world", "c", "java"};// char 类型的二维数组// 注意,也不支持先声明再赋值。即下面的赋值方式是错误的
char strs[4][6];
strs = {"hello", "world", "c", "java"};

其中的 row 表示二维数组中的行,表示有几个字符串;而 col 表示二维数组中的列,表示能存放字符串的最大长度。

  • 第二种,字符指针数组

可以用一维的字符指针数组来保存字符串,格式是:char* strs[len];。例如:

char* strs[4] = {"hello", "world", "c", "java"};// char* 类型的一维数组注意,也不支持先声明再赋值。即下面的赋值方式是错误的
char* strs[4];
strs = {"hello", "world", "c", "java"};

该一维数组中的每一个元素都是一个 char 类型的地址:

  • 第一个指针 strs[0] 指向第一个字符串中的第一个字符。即 *strs[0] 等于 'h'
  • 第二个指针 strs[1] 指向第二个字符串中的第一个字符。即 *strs[1] 等于 'w'

每个 strs[i] 都表示一个字符串,指针都指向对应字符串的第一个字符。

因此实际上这个一维数组并不存放真正的字符串,而只是存放字符串的地址。

从键盘输入字符串数组

有时候我们需要批量从键盘输入字符串,无论是二维字符数组还是一维字符指针数组,都可以通过循环输入字符串的方式来给字符串数组赋值,而从键盘输入字符串的方式有 scanfgets 两种,根据情况选择即可:

  • 二维字符数组表示的字符串数组的批量赋值
#include <stdio.h>int main() {// 声明二维字符数组,注意指定字符串个数和字符串最大长度char strs[4][10];// 通过循环批量输入字符串并赋值给字符串数组for (int i = 0; i < 4; i++) {scanf("%s", strs[i]);// 或者使用 gets() 函数// gets(strs[i]);}// 打印结果for (int i = 0; i < 4; i++) {printf("%s\n", strs[i]);}
}
  • 一维字符指针数组表示的字符串数组的批量赋值
#include <stdio.h>
#include <malloc.h>int main() {// 声明一维字符指针数组char *strs[4];// 通过循环批量输入字符串并赋值给字符串数组for (int i = 0; i < 4; i++) {// 声明字符串,并为其分配内存空间char *str = (char *) malloc(sizeof(char) * 10);gets(str);// 使用 gets 函数从键盘读取输入strs[i] = str;// 赋值// 或者使用 scanf() 函数// scanf("%s", str);// 注意,我们不能直接使用 gets(strs[i]); 或者 scanf("%s", strs[i]); 来进行赋值}// 打印结果for (int i = 0; i < 4; i++) {printf("%s\n", strs[i]);}
}

输出字符串数组

输出字符串数组,实际上就是循环数组输出每个字符串,而输出字符串的函数有 printfputs

无论是二维字符数组还是一维字符指针数组,都可以通过循环遍历输出字符串数组中的所有字符串:

#include <stdio.h>int main() {// 二维字符数组声明的字符串数组char strs[4][10] = {"tom", "jack", "rose", "lily"};for (int i = 0; i < 4; i++) {printf("%s\t", strs[i]);}printf("\n");// 一维指针数组声明的字符串数组char *strs2[4] = {"java", "javascript", "python", "c"};for (int i = 0; i < 4; i++) {puts(strs2[i]);}
}

访问字符串数组中的字符串

如果要访问二维字符数组声明的字符串数组中的字符串,可以通过两种方式:

  • 下标,例如:strs[i]
  • 数组名加下标,例如:*(strs + i)
#include <stdio.h>int main() {char strs[4][10] = {"tom", "jack", "rose", "lily"};// 通过数组下标来访问,例如:strs[i],其中 i 是数组下标printf("%s\n", strs[1]);// 通过数组名加下标的方式来访问,例如:*(strs + i),其中 strs 是数组名,而 i 是数组下标printf("%s\n", *(strs + 2));
}

如果要访问一维字符指针数组声明的字符串数组中的字符串,也可以通过上面的两种方式来访问:

#include <stdio.h>int main() {char *strs[4] = {"tom", "jack", "rose", "lily"};// 通过数组下标来访问,例如:strs[i],其中 i 是数组下标printf("%s\n", strs[1]);// 通过数组名加下标的方式来访问,例如:*(strs + i),其中 strs 是数组名,而 i 是数组下标printf("%s\n", *(strs + 2));
}

即无论是二维字符数组声明的字符串数组还是一维字符指针数组声明的字符串数组,都可以通过下标或者数组名加下标的方式访问数组中的字符串。

修改字符串数组中的字符串

只有二维字符数组声明的字符串数组才可以通过 strcpy 或者 sprintf 函数进行赋值,而一维字符指针数组声明的字符串数组不允许修改数组中的字符串:

#include <stdio.h>
#include <string.h>int main() {// 1.二维字符数组声明的字符串数组char strs[4][10] = {"tom", "jack", "rose", "lily"};// 1.1 使用 strcpy 函数进行赋值strcpy(strs[1], "java");// 1.2 使用 sprintf 函数进行赋值sprintf(strs[2], "tomcat");// 输出字符串,查看是否修改完成for (int i = 0; i < 4; i++) {printf("%s\t", strs[i]);}// 2.一维字符指针数组声明的字符串数组,无法对字符串进行修改char *strs2[4] = {"java", "javascript", "c", "c++"};// 2.1 使用 strcpy 函数进行赋值,错误的示范// strcpy(strs2[1], "JAVASCRIPT");// 2.2 使用 sprintf 函数进行赋值,错误的示范// sprintf(strs2[2], "C");// 下面是错误的示例:// 通过数组下标来修改,这是错误的// strs[1]="张三";// 通过数组名加下标的方式来修改,这也是错误的// *(strs+2)="李四";
}

访问字符串数组中的字符串的字符

如果是二维字符数组声明的字符串数组,可以通过如下两种方式来访问(其中 i 和 j 都是指数组的下标,一个是横坐标,一个是纵坐标,都从 0 开始):

  • 下标,格式是:字符串数组名[i][j]。例如,strs[0][1]
  • 数组名加下标,格式是:*(*(字符串数组名 + i) + j)。例如,*(*(strs + 1) + 2)
#include <stdio.h>int main() {// 1.二维字符数组声明的字符串数组char strs[4][10] = {"tom", "jack", "rose", "lily"};// 1.1通过数组下标访问字符串数组中字符串中的字符char c;c = strs[1][1];printf("%c\n", c);// 'a'// 1.2通过数组名加下标的方式访问c = *(*(strs + 1) + 2);printf("%c\n", c);// 'c'
}

如果是一维指针数组声明的字符串数组,也可以通过上面两种方式来访问:

#include <stdio.h>int main() {// 2.一维指针数组声明的字符串数组char *strs[4] = {"tom", "jack", "rose", "lily"};// 2.1通过数组下标访问字符串数组中字符串中的字符char c;c = strs[1][1];printf("%c\n", c);// 'a'// 2.2通过数组名加下标的方式访问c = *(*(strs + 1) + 2);printf("%c\n", c);// 'c'
}

修改字符串数组中的字符串的字符

如果是二维字符数组声明的字符串数组,可以通过如下两种方式来修改字符(其中 i 和 j 都是指数组的下标,一个是横坐标,一个是纵坐标,都从 0 开始):

  • 下标,格式是:字符串数组名[i][j]='新字符'。例如,strs[0][1]='X'
  • 数组名加下标,格式是:*(*(字符串数组名 + i) + j)='新字符'。例如,*(*(strs + 1) + 2)='X'
#include <stdio.h>int main() {// 1.二维字符数组声明的字符串数组char strs[4][10] = {"tom", "jack", "rose", "lily"};// 1.1通过数组下标访问字符串数组中字符串中的修改strs[1][1] = 'X';printf("%c\n", strs[1][1]);// 'X'// 1.2通过数组名加下标的方式修改*(*(strs + 1) + 2) = 'Y';printf("%c\n", *(*(strs + 1) + 2));// 'Y'// 打印字符串,查看是否修改成功for (int i = 0; i < 4; i++) {puts(strs[i]);}
}

但是对于通过一维指针数组声明的字符串数组,里面的字符串是无法修改的,而字符串里面的字符更不能修改。

#include <stdio.h>int main() {// 2.一维字符指针数组声明的字符串数组char *strs[4] = {"tom", "jack", "rose", "lily"};// 2.1通过数组下标访问字符串数组中字符串中的修改// strs[1][1] = 'X';// 错误的写法// 2.2通过数组名加下标的方式修改// *(*(strs + 1) + 2) = 'Y';// 错误的写法
}

遍历字符串数组中的所有字符串

即遍历字符串数组,无论是二维字符数组声明的字符串数组还是一维字符指针声明的字符串数组,都可以通过 for 循环等循环语句来遍历数组,然后通过下标(例如,strs[i])或者数组名加下标(例如,*(strs + i))的访问字符串:

#include <stdio.h>int main() {// 1.二维字符数组声明的字符串数组char strs[4][10] = {"java", "javascript", "c", "c++"};// 1.1通过 for 循环for (int i = 0; i < 4; i++) {printf("%s\t", strs[i]);}printf("\n");// 1.2通过 while 循环int i = 0;while (i < 4) {printf("%s\t", *(strs + i));i++;}printf("\n");// 2.一维字符指针数组声明的字符串数组char *strs2[4] = {"tom", "jack", "rose", "lily"};// 2.1通过 for 循环for (i = 0; i < 4; i++) {printf("%s\t", strs2[i]);}printf("\n");// 2.2通过 while 循环i = 0;while (i < 4) {printf("%s\t", *(strs2 + i));i++;}
}

C语言零碎知识点之字符串数组相关推荐

  1. java 数组 字符串 编程_Java语言基础知识之字符串数组

    Java语言基础知识之字符串数组 java语言中,数组是一种最简单的复合数据类型.数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来唯一地确定数组中的元素.数组有 ...

  2. java返回字符数组_JAVA语言实现随机返回字符串数组中的字符串

    本文主要向大家介绍了JAVA语言实现随机返回字符串数组中的字符串,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. //随机返回字符串数组中的字符串 public static Stri ...

  3. c语言如何赋值空字符串,c语言中如何给字符串数组赋值

    c语言中如何给字符串数组赋值 1.问题 这是我写的 struct student { int x; char name[10]; }; void main() { student st: st.nam ...

  4. c 语言定义2维字符串数组赋值,二维数组赋值字符串 c 语言 二维字符串数组赋值问题...

    C语言中二维字符数组应该怎样赋值? c语言二维数组如何定义字符串????急... 二维字符数组的定义格式为:char 数组名[第一维大小][第二维大小]; 例如:char c[3][10]; //定义 ...

  5. c语言:动态输入字符串数组

    考研题中经常会遇到给定一条英文句子,让我们对其每个单词进行操作,不同于对整型数据操作,字符串在c语言中必须存放到数组中,无形之中又给考题增加了难度 一般情况下,字符串数组都以二维数组或指针数组定义,而 ...

  6. 2021天梯赛真题题解 L1-3 强迫症 (10 分) C语言版本 整数转换为字符串数组

    L1-3 强迫症 (10 分) 题目描述 小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808.有强迫症的小强请你写个程序,把所有人的 ...

  7. 【C语言】C语言零碎知识点

    目录 1.sizeof和strlen ​2.函数形参(很重要) ​2.1传值调用 ​2.2传址调用 ​3.函数的嵌套调用和链式访问 ​3.1函数的嵌套调用 ​3.2函数的链式访问 ​4.隐式类型转换 ...

  8. c语言 map转换成字符串数组,JSON数组形式字符串转换为ListMapString,String的几种方法...

    json转map通用方法 这里提供一方法,可以当作工具类,只要json字符串没有问题,嵌套几层都可以. import net.sf.json.JSONArray; import net.sf.json ...

  9. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

    结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好? typedef struct person{ char *name; int age; char sex[6]; }: 该结构体中nam ...

最新文章

  1. 显示Iframe指定位置
  2. 文巾解题 810. 黑板异或游戏
  3. Java 洛谷 P1914 小书童——密码
  4. 借助xxl-sso实现SSO
  5. 转 批处理 %~dp0的意义
  6. Vue音乐项目笔记(三)
  7. ThinkPHP2.1 增加PHPCMS模板引擎,支持PC标签(get,json)
  8. 浮动元素遇到标准流元素 会发生转角遇到爱
  9. 标准工时分析软件VIOOVI,适配现代化工业的人工智能软件
  10. 微信小程序统一封装request请求,统一拦截校验
  11. Win XP 经典壁纸拍摄地 24 年后变样了
  12. YYText学习之根据range设置text的颜色和边框
  13. PAT练习 人口普查
  14. Nano配置永久静态IP
  15. 大多数人不知道淘宝天猫有内部优惠卷,能省钱的公众号,购物省钱妙招
  16. 「TCG 规范解读」初识嵌入式和工业工作组
  17. 算法思想之递归分治回溯
  18. 基于Vue实现的网页音乐播放器
  19. 应届实习生,北京短租经验分享
  20. Pycharmpython安装教程

热门文章

  1. cypress之实现文件上传下载以及操作iframe下页面元素
  2. java计算机毕业设计校园社团管理平台演示录像2021源码+mysql数据库+lw文档+系统+调试部署
  3. linux wifi shell,用shell脚本实现linux系统上wifi模式(STA和soft AP)的转换
  4. 项目管理 PMP报考条件?
  5. java与php的优缺点_java和php的发展前景以及优劣势
  6. electron-asar的编译和反编译
  7. rqn 516 多项式输出(字符串输出处理)
  8. 2019年软件架构师考试时间
  9. Spring5的IOC原理解析
  10. 运动蓝牙耳机什么好?运动蓝牙耳机之好评