2021年信息学部物联网工程学院学生科协第一次软件大培训

2021年信息学部物联网工程学院学生科协第一次软件大培训

  • 数组
    • 数组的定义
    • 一维数组
      • 一维数组数组的定义格式
      • 一维数组的访问
      • 一维数组的初始化
      • 一维数组与循环
    • 二维数组
      • 二维数组的定义格式
      • 二维数组的访问
      • 二维数组的存储结构
      • 二维数组的初始化
        • 对每个元素进行赋值
        • 对部分元素进行赋值
        • 简略形式(省略第一维)
  • 字符串
    • C语言中的字符串
    • 字符串的初始化
    • 字符串的存储结构
    • 字符串的输入与输出
    • 字符串处理函数
      • strlen
      • strcpy
      • strcat
      • strcmp
  • 附录
    • ASCII码表

数组

数组的定义

通俗的说,数组就是存储一批相同类型数据的容器。

一维数组

一维数组数组的定义格式

<类型> 数组变量名[元素数量]

例如:

int x[10]; // 数组长度为10的int型数组
float x[10]; // 数组长度为10的float型数组
char x[10]; // 数组长度为10的字符数组

注意:元素数量必须是一个正整数且在C99标准以前,元素数量必须是个确定的数。

例如,下列定义在C99标准以前是不正确的:

int N = 10;
int x[N];

一维数组的访问

基本格式:数组名[下标]

为方便理解,可以将一维数组用一个一行N列的线性表格来表示。

例如int x[10]可以用下列表格表示:

在这里插入图片描述

访问数组的元素和访问其他类型的变量类似,例如:

scanf("%d", &x[0]); // 读入一个数,并存放到x[0]中
printf("%d", x[1]); // 输出x[1]的值
x[2] = 2; // 将x[2]赋值为2
a = x[3]; // 把x[3]的值赋给变量a

特别提醒:

C语言中,数组下标范围是0到n-1,而不是1到n。而C语言不要求检查下标的范围。因此,当下标超出范围时,程序可能会执行不可预知的行为。

一维数组的初始化

int a[3] = {0};// 将所有元素初始化为0
int a[3] = {1, 2, 3};// 对每个元素分别赋值为1、2、3
int a[] = {1, 2, 3};// 对每个元素赋值,并让编译器自己计算数组的大小
int a[6] = {1, 2};// 将前两个元素赋值为1和2,剩下赋值为0

一维数组与循环

循环常常与一维数组结合进行赋值和输出。例如:

// 通过循环对一维数组的每一个元素赋值
int a[10];
int i;
for (i = 0; i < 10; i++) {
	scanf("%d", &a[i]);
}
// 通过循环输出一维数组的每一个元素
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for (i = 0; i < 10; i++) {
	printf("%d\n",a[i]);
}

二维数组

二维数组的定义格式

<类型> 数组变量名[维数1][维数2]

例如:

int x[5][9];// 定义一个5行9列的二维数组

二维数组的访问

基本格式:

x[i-1][j-1] 表示二维数组x的第i行第j列的元素。

为方便理解,可以将而维数组用一个N行M列的表格来表示。

例如int x[5][9]可以用下列表格来表示:

2021年信息学部物联网工程学院学生科协第一次软件大培训_第1张图片

与一维数组一样,二维数组在访问时同样需要注意越界问题。

二维数组的存储结构

二维数组本质上是数组的数组,即以数组作为数组元素的数组。在内存中,二维数组和一维数组一样是以线性方式存储的。以上述int x[5][9]为例,其在内存中的存储结构如下图所示

2021年信息学部物联网工程学院学生科协第一次软件大培训_第2张图片

二维数组的初始化

对每个元素进行赋值

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

对部分元素进行赋值

int x[3][4]={{1,2},{5,6},{9,10}};
// 等价于
int x[3][4]={{1,2,0,0},{5,6,0,0},{9,10,0,0}};

int x[3][4]={1,2,3};
// 等价于
int x[3][4]={1,2,3,0,0,0,0,0,0,0,0,0};

简略形式(省略第一维)

int x[][4]={1,2,3,4};
// 等价于
int x[1][4]={1,2,3,4};

字符串

C语言中的字符串

C语言中通常使用char数组来存储字符串。

字符串的初始化

char str1[5] = {'e', 's', 't', 'a', '\0'}; // 单独初始化元素
char str2[] = {'e', 's', 't', 'a', '\0'}; // 不写数组大小
char str3[] = {"esta"}; // 使用字符串常量初始化字符数组
char str4[] = "esta"; // 使用字符串常量初始化,可以省略大括号

字符串的存储结构

字符串的存储结构与字符数组类似,但在结尾处会有一个\0\0为转义字符,表示字符串的结束标志。例如:

2021年信息学部物联网工程学院学生科协第一次软件大培训_第3张图片

字符串的输入与输出

scanf("%s",str); // 读入(注意,不用写&)
printf("%s",str); // 输出

字符串处理函数

注意:在使用下述字符串处理函数时,需要导入头文件string.h

strlen

使用方法:strlen(str)

功能:用于返回指定字符串变量str的长度。

举例:

// 注意strlen和sizeof的区别
char str[] = "esta";
printf("strlen(str):%d\n", strlen(str));
printf("sizeof(str):%d", sizeof(str));

输出结果:

strlen(str):4
sizeof(str):5

解释:

sizeof计算的是整个字符数组的长度,包括\0

2021年信息学部物联网工程学院学生科协第一次软件大培训_第4张图片

strlen计算的是字符串的长度,不包括\0
2021年信息学部物联网工程学院学生科协第一次软件大培训_第5张图片

strcpy

使用方法:strcpy(str1, str2)

功能:将str2拷贝到str1中,包含最后的结束符 ‘\0’。

注意:

1.为了避免溢出,必须确保用于存放的数组长度足以容纳待拷贝的字符串(长度需要包含结束符 ‘\0’)。

2.不能直接使用"="(赋值语句)将一个字符串拷贝给另一个字符串变量,亦不可直接用"="(赋值语句)对一个字符数组赋值(定义该变量时除外)。

strcat

使用方法: strcat(str1, str2)

功能:将一个字符连接到目标字符串后边,在此过程将覆盖第一个参数的结束符 ‘\0’。

strcmp

使用方法: strcmp(str1, str2)

功能:用于比较两个字符串的大小。具体地说:

从第一个字符开始,依次比较每个字符的 ASCII 码大小,直到发现两个字符不相等或结束时(‘\0’)为止。

返回值 意义
<0 字符串 1 的字符小于字符串 2 对应位置的字符
=0 两个字符串的内容完全一致
>0 字符串1 的字符大于字符串 2 对应位置的字符

举例:

int res = strcmp("esta", "hhu");
printf("%d",res);

输出结果():

-1

解释:

2021年信息学部物联网工程学院学生科协第一次软件大培训_第6张图片

该函数依次遍历每个对应位置的字符。由于e

从本例中我们可以看出,strcmp函数的返回值与字符串长度无关,只与字符串对应位置上的字符ASCII码值大小有关。

附录

ASCII码表

2021年信息学部物联网工程学院学生科协第一次软件大培训_第7张图片

你可能感兴趣的:(软件,笔记,基础入门,c语言)