# 数组和字符串
# 概述
数组是一种数据结构,它是一组连续的内存空间,用来存储一组具有相同类型的数据。
- 数组的每个元素都是相同的数据类型,可以是基本数据类型,也可以是引用数据类型。并且所有成员在内存中是连续存储的。
- 数组的长度是固定的,一旦创建,长度就不可改变。
- 数组元素类型不同,数组可分为:数值型数组、字符型数组、布尔型数组、引用类型数组等。
- 数组的下标个数称为数组的维数,数组的维数可以是1维、2维、3维等。
# 一维数组
# 定义和使用
- 一维数组的定义格式:
数据类型 数组名[数组长度]
。 - 一维数组的初始化格式:
数据类型 数组名[数组长度] = {元素1, 元素2, ...}
。 - 一维数组的访问格式:
数组名[下标]
。
TIP
- 数组的下标从0开始,到数组长度-1结束。
- 数组的长度必须是一个常量,不能是变量。
- 数组的长度可以省略,但是必须初始化。
- 数组名不能与其他变量名重复。同一个作用域内,不能有两个名字相同的变量。
#include <stdio.h>
int main() {
//定义一个长度为5的整型数组
int arr[5];
//定义一个长度为5的整型数组,并初始化
int arr2[5] = {1, 2, 3, 4, 5};
//定义一个长度为5的整型数组,并初始化
int arr3[5] = {1, 2, 3};
//定义一个长度为5的整型数组,并初始化
int arr4[5] = {0};
//定义一个长度为5的整型数组,并初始化
int arr5[] = {1, 2, 3, 4, 5};
//访问数组元素
printf("%d\n", arr2[0]); //1
printf("%d\n", arr2[1]); //2
printf("%d\n", arr2[2]); //3
printf("%d\n", arr2[3]); //4
printf("%d\n", arr2[4]); //5
return 0;
}
# 案例
# 数组最大值
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int max = arr[0];
for (int i = 1; i < 5; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
printf("max = %d\n", max);
return 0;
}
# 数组逆置
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int temp;
for (int i = 0; i < 5 / 2 ; i++) {
temp = arr[i];
arr[i] = arr[4 - i];
arr[4 - i] = temp;
}
}
# 二维数组
# 定义和使用
- 二维数组的定义格式:
数据类型 数组名[行数][列数]
。 - 二维数组的初始化格式:
数据类型 数组名[行数][列数] = {{元素1, 元素2, ...}, {元素1, 元素2, ...}, ...}
。 - 二维数组的访问格式:
数组名[行下标][列下标]
。 - 二维数组的行数和列数都必须是常量,不能是变量。
TIP
- 二维数组的行数和列数都必须是常量,不能是变量。
- 二维数组的行数和列数可以省略,但是必须初始化。
- 内存中并不存在二维数组,二维数组在内存中是以一维数组的形式存储的。
#include <stdio.h>
int main() {
//定义一个3行4列的整型数组
int arr[3][4];
//定义一个3行4列的整型数组,并初始化
int arr2[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}};
//定义一个3行4列的整型数组,并初始化
int arr3[3][4] = {1, 2, 3, 4, 5, 6, 7, 8};
//定义一个3行4列的整型数组,并初始化
int arr4[3][4] = {0};
//定义一个3行4列的整型数组,并初始化
int arr5[][4] = {1, 2, 3, 4, 5, 6, 7, 8};
//访问数组元素
printf("%d\n", arr2[0][0]); //1
printf("%d\n", arr2[0][1]); //2
printf("%d\n", arr2[0][2]); //3
printf("%d\n", arr2[0][3]); //4
printf("%d\n", arr2[1][0]); //5
printf("%d\n", arr2[1][1]); //6
printf("%d\n", arr2[1][2]); //7
printf("%d\n", arr2[1][3]); //8
printf("%d\n", arr2[2][0]); //9
printf("%d\n", arr2[2][1]); //10
printf("%d\n", arr2[2][2]); //11
printf("%d\n", arr2[2][3]); //0
return 0;
}
# 案例
# 二维数组逆置
#include <stdio.h>
int main() {
int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}};
int temp;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4 / 2; j++) {
temp = arr[i][j];
arr[i][j] = arr[i][3 - j];
arr[i][3 - j] = temp;
}
}
return 0;
}
# 二维数组打印
#include <stdio.h>
int main() {
int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
# 字符数组与字符串
# 区别:
- C语言中没有字符串类型,字符串是用字符数组来表示的。
- 字符数组是一种特殊的一维数组,用来存储字符串。
- 字符串是以
'\0'
结尾的字符数组。 - 字符串的长度是不包含
'\0'
的长度。
# 定义和使用
- 字符数组的定义格式:
数据类型 数组名[数组长度]
。 - 字符数组的初始化格式:
数据类型 数组名[数组长度] = "字符串"
。 - 字符数组的访问格式:
数组名[下标]
。
#include <stdio.h>
int main() {
//定义一个长度为5的字符数组
char arr[5];
//定义一个长度为5的字符数组,并初始化
char arr2[5] = {'h', 'e', 'l', 'l', 'o'};
//定义一个长度为5的字符数组,并初始化
char arr3[5] = "hello";
//定义一个长度为5的字符数组,并初始化
char arr4[] = "hello";
//访问数组元素
printf("%c\n", arr2[0]); //h
printf("%c\n", arr2[1]); //e
printf("%c\n", arr2[2]); //l
printf("%c\n", arr2[3]); //l
printf("%c\n", arr2[4]); //o
return 0;
}
# 字符串的输入输出
C语言中没有提供直接输出字符串的函数,需要使用循环来输出字符串。
#include <stdio.h>
int main() {
char arr[] = "hello";
//输出字符串
for (int i = 0; i < 5; i++) {
printf("%c", arr[i]);
}
printf("\n");
//输入字符串
for (int i = 0; i < 5; i++) {
scanf("%c", &arr[i]);
}
printf("%s\n", arr);
return 0;
}
函数 | 说明 | 参数 | 返回值 |
---|---|---|---|
gets() | 用来输入字符串,可以输入空格,以回车结束。 | char *s :指向用来存储输入字符串的数组。 | char * :返回输入的字符串。 |
puts() | 用来输出字符串,输出完毕后会自动换行。 | char *s :指向要输出的字符串。 | int :返回输出的字符个数。 |
fgets() | 用来输入字符串,可以输入空格,以回车结束。 | char *s :指向用来存储输入字符串的数组。 int n :最多读取的字符个数。 FILE *stream :指向要读取的文件。 | char * :返回输入的字符串。 |
fputs() | 用来输出字符串,输出完毕后不会自动换行。 | char *s :指向要输出的字符串。 FILE *stream :指向要写入的文件。 | int :返回输出的字符个数。 |
scanf() | 用来输入字符串,以空格、制表符、换行符结束。 | char *format :格式控制字符串。 ... :要输入的字符串。 | int :返回成功匹配并赋值的个数。 |
strlen() | 用来计算字符串的长度,不包含 \0 。 | char *s :指向要计算的字符串。 | int :返回字符串的长度。 |
gets()
函数:用来输入字符串,可以输入空格,以回车结束。
TIP
gets()
函数会自动在输入的字符串末尾添加\0
。gets()
函数会自动忽略回车键。
puts()
函数:用来输出字符串,输出完毕后会自动换行。
TIP
puts()
函数会自动在输出的字符串末尾添加\n
。
#include <stdio.h>
int main() {
char arr[100];
//输入字符串
gets(arr);
//输出字符串
puts(arr);
return 0;
}
fgets()
函数:用来输入字符串,可以输入空格,以回车结束。
TIP
fgets()
函数会自动在输入的字符串末尾添加\0
。fgets()
函数会自动忽略回车键。
fputs()
函数:用来输出字符串,输出完毕后不会自动换行。
TIP
fputs()
函数会自动在输出的字符串末尾添加\n
。
#include <stdio.h>
int main() {
char arr[100];
//输入字符串
fgets(arr, 100, stdin);
//输出字符串
fputs(arr, stdout);
return 0;
}
scanf()
函数:用来输入字符串,以空格、制表符、换行符结束。
TIP
scanf()
函数会自动在输入的字符串末尾添加\0
。
#include <stdio.h>
int main() {
char arr[100];
//输入字符串
scanf("%s", arr);
//输出字符串
printf("%s\n", arr);
return 0;
}
strlen()
函数:用来计算字符串的长度,不包含\0
。
TIP
strlen()
函数不会自动在输入的字符串末尾添加\0
。
#include <stdio.h>
int main() {
char arr[] = "hello";
printf("%d\n", strlen(arr));
return 0;
}
# 案例
# 字符串添加
#include <stdio.h>
int main() {
char arr[100] = "hello";
//输入字符串
scanf("%s", arr);
//输出字符串
printf("%s\n", arr);
return 0;
}