当前位置: 首页 > news >正文

C语言——二维数组和字符数组

二维数组

二维数组本质上是一个行列式的组合,也就是二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。

定义形式:

类型(说明符)  数组名[行数(常量表达式1)][列数(常量表达式2)];

eg:

int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}}

int arr[][] = {{1,2,3},{4,5,6},{7,8,9}}

int arr[3][] = {{1,2},{4,5,6},{7}}//等价于int arr[3][3]

说明:

在C语言中,二维数组在计算机中的存储顺序是按行进行的。

二维数组元素

表示形式:

数组名[下标1][下标2];

eg:  

a[2][3],b[4][9];

 

下标可以是整型表达式,如:a[2-1][2*2-1]

下标可以是已经有值的变量或数组元素, 如:a[2*x-1][b[3][1]]

数组元素可以出现在表达式中, 如:b[1][2]=a[2][3]/2

注意:

使用时数组元素的下标应在已定义数组的大小范围内;      

应注意区别定义数组大小和引用数组元素的区别。

二维数组初始化

方法:

⑴ 分行给二维数组赋初值。如:

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

⑵ 可将所有数据写在一个花括号内,按排列顺序对个元素赋值。如:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

⑶ 可对部分元素赋初值,其余自动取0值(\0|0.0)。如:

int a[3][4]={{1},{5,6},{9}};

⑷ 若对全部元素赋初值,则定义数组时可不说明第一维的长度(对方括号不能省),第二维的长度必须指明。如:

int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};

⑸ 在分行赋初值时,也可以省略第一维的长度说明。如:

int a[ ][4]={{1,2,3},{0},{0,10}};

eg:

二维数组的遍历

#include <stdio.h>

int main()

{

        int arr[][3] = {{1},{2,4},{5,6,7}};// 经过论证:二维数组我们必须指明第2维的数组的长度

        // 获取行元素的大小

        int length = sizeof(arr) / sizeof(arr[0]); // 如果是二维数组,第1维的长度,应该是如左侧这样获取

        printf("length:%d\n",length);

        

        // 遍历二维数组,需要使用双层for循环,外层遍历内层遍历每一行的

        for(int row = 0;row length;row++)

        {

        // 获取列元素的总大小

        int len = sizeof(arr[row]) / sizeof(int);

        for(int col = 0; col len; col++)

        {

        // 获取列元素

        printf("%3d",arr[row][col]);// 意思是获取数组arr 第row行第col列

        }

        printf("\n");

        }

        return 0;

        }// 数据类型,分支结构,循环结构,数组

二维数组:矩阵转置

/**

* 需求:二维数组案例-矩阵的转置(就是将一个2行3列的数组转换为3行2列的数组)

*/

#include

int main()

        {

        // 准备2个数组,存放转前和转后的数据

        int arr_before[2][3] = {1,2,3,4,5,6};

        int arr_after[3][2] = {0};// 初始化,每一列上都是0

        

        // 遍历arr_before

        for(int i = 0;i sizeof(arr_before)/sizeof(arr_before[0]);i++)

        {

        for(int j = 0;j sizeof(arr_before[i])/sizeof(int);j++)

        

        // 转置

        arr_after[j][i] = arr_before[i][j];

        }

        }

        // 遍历arr_after

        for(int i = 0;i sizeof(arr_after)/sizeof(arr_after[0]);i++)

        {

        for(int j = 0;j sizeof(arr_after[i])/sizeof(int);j++)

        {

        // 输出

        printf("%4d",arr_after[i][j]);

        }

        printf("\n");

        }

        return 0;

        }

字符数组

概念:

元素类型为char字符型的数组,字符数组往往是用来存储字符串数据的。需要注意的一点是,我们

C语言中的字符是字节字符。

字节字符:也就是一个字符占1个字节

语法:

char 数组名[容量]

char 数组名[行容量][列容量]

测试:

char a = 'A'

char b = '1'

char c = 65

char d = "A"  //错误,因为这是字符串写法,也是char数组的写法,char d[1] = "A"

char e = “马”  //错误,中文一个字符超过一个字节

eg:

#include <stdio.h>

int main()
{
        char arr[7][7] = {{' ',' ',' ','*',' ',' ',' '},
                          {' ',' ','*',' ','*',' ',' '},
                          {' ','*',' ',' ',' ','*',' '},
                          {'*',' ',' ',' ',' ',' ','*'},
                          {' ','*',' ',' ',' ','*',' '},
                          {' ',' ','*',' ','*',' ',' '},
                          {' ',' ',' ','*',' ',' ',' '}
                         };

        for(int i = 0;i < sizeof(arr)/sizeof(arr[0]);i++)
        {
                for(int j =0;j < sizeof(arr[i])/sizeof(char);j++)
                {
                        printf("%c",arr[i][j]);
                }
                printf("\n");
        }

        return 0;
}

字符串和字符串结束标志

说明:

C语言规定,字符串以字符'\0'作为结束标志

编译系统对字符串常量自动加一个'\0'作为结束标志。

程序中往往通过判断'\0'来检测字符串是否结束。

'\0'的ASCII码为0,不是一个可显示的字符,是“空操作符”,什么都不做,不会增加有效字符,仅是一个供判别的标志。

字符数组的多样表示

char数组可以以数组的方式一个个输出每个字符;我们的char数组也可以以字符串的方式整体进行输出所有字符

具体如下面案例:

/*

需求:字符数组->字符串

*/

#include

int main()

{

// 字符串第1种表示:

char s1[] = {'h','e','l','l','o',' ','w','o','r','l','d'};

// 字符串第2种表示:

char s2[] = {"hello world"};

// 字符串第3种表示:

char s3[] = "hello world";

// 测试,使用字符串方式打印,这样就不用一一遍历

printf("%s\n",s1);        //hello world

printf("%s\n",s2);        //hello world

printf("%s\n",s3);        //hello world

return 0;

}

注意:

字符串的长度与字符数组的长度不一定相同。

利用字符串常量可以对字符数组进行初始化,但不能用字符串常量为字符数组赋值。

// 正确写法:利用字符串常量给字符数组初始化

char b[15] = "China";

// 错误写法:利用字符串常量给字符数组赋值

char b[15];

b[15] = "China";

字符串输入

格式:

scanf("%s",数组名)

注意:

采用scanf进行字符串输入,要求字符串中不能存在空格,否则字符串遇到空格会结束。

fgets(数组名,数组容量,stdin);

说明:采用fgets进行字符串输入,可获取所有输入的字符串,包含\n,在实际的字符串处理时,我们可能需要处理\n

注意:

1. 如果输入的字符串不包含空格和换行,可以使用scanf() | fgets();

2. 如果输入的字符串需要包含空格和换行,只能使用fgets();

3. 经过对比,我们发现,在字符串的输入中,fgets()更好;

字符串输出

puts(数组名)

printf("%s",数组名);

字符串拼接

strcat(数组名,"需要拼接的字符串")

注意:需要引入#include  <string.h>

字符串拷贝

strcpy(数组名,字符串)

注意:需要引入<string.h>

说明:这个方法适合给字符串赋值用。

字符串比较

strcmp(字符串1,字符串2);

注意:

1. 需要引入<string.h>

2. 返回的结果是boolean

获取字符串长度

strlen(字符串)

注意:

1. 需要<string.h>

2. 返回字符串长度

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 嵌入式单片机中在线调试工具使用方法
  • linux下交叉编译licensecc
  • HarmonyOS开发商城首页实现二
  • 嘉兴网站建设的思路
  • 【JDK】JDK环境配置踩坑记录Mac
  • CAD-文字、图块、多行文字,沿多段线对齐到多段线的顶点,沿直线进行均分,都可以操作
  • Python 编程实例
  • 计算机技术基础 (bat 批处理)Note6
  • 3096. 得到更多分数的最少关卡数目
  • 【leetcode详解】直角三角形:用空间换时间(O(m*n*(m+n))>O(m*n))(思路详解)
  • 使用Python做一个微信机器人
  • android 音频播放器,(二)SoundPool简介
  • 面试经典 222. 完全二叉树的节点个数
  • 身份证OCR识别接口如何对接?(二)
  • 《Linux运维总结:基于Ubuntu 22.04+x86_64架构CPU部署etcd 3.5.15二进制分布式集群》
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS实用技巧干货
  • DataBase in Android
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • leetcode-27. Remove Element
  • MySQL主从复制读写分离及奇怪的问题
  • 搭建gitbook 和 访问权限认证
  • 代理模式
  • 给初学者:JavaScript 中数组操作注意点
  • gunicorn工作原理
  • (152)时序收敛--->(02)时序收敛二
  • (4)logging(日志模块)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (Note)C++中的继承方式
  • (solr系列:一)使用tomcat部署solr服务
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (ZT)薛涌:谈贫说富
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .net core 的缓存方案
  • .Net Core 生成管理员权限的应用程序
  • .NET IoC 容器(三)Autofac
  • .NET Micro Framework初体验
  • .net和jar包windows服务部署
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET微信公众号开发-2.0创建自定义菜单
  • [5] CUDA线程调用与存储器架构
  • [C#]C#学习笔记-CIL和动态程序集
  • [C++]18:set和map的使用
  • [C语言]——函数递归
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件
  • [Hive] INSERT OVERWRITE DIRECTORY要注意的问题
  • [ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】