C语言中的数组
一维数组
1.一维数组的声明
数据类型 数组名 [数组长度]
比如int arr[20];char str [20];
- 可以在声明数组的时候给数组赋初值
int arr[2]={1,2};char str [12]={'H','E','L','L','O',' ','W','O','R','L','D'};
- 如果不赋初值 默认是0
int arr[2];printf("%d",arr[0]);//此时应输出0;
- 如果声明数组的时候赋上初值 则数组长度可以不写
char str []={'H','E','L','L','O',' ','W','O','R','L','D'};
- 如果没有赋上初值 则数组长度必须要写
char str [];//是错误的声明方法
- 数组下标从0开始到数组长度-1为止
char str[10]
为str[0]到str[9] 使用越界的下标如str[10]可能会导致程序报错
2.一维数组的使用
(1) 把1~10存入数组 并逆序输出
#include<stdio.h>
//1~10存入数组 并逆序输出
int main()
{
int sum=0;
int a[10];
//把1~10存入数组
for(int step=0; step<10; step++)
{
a[step]=step+1;
}
//使用递减的step 逆序输出数组
for(int step=9; step>=0; step--)
{
printf("%d ",a[step]);
}
printf("\n");
return 0;
}
(2) 从键盘接受十个数字并进行冒泡排序
#include<stdio.h>
//对十个数进行冒泡排序
int main()
{
int a[10];
//循环往数组中输入每个数
for(int i=0; i<10; i++)
{
scanf("%d",&a[i]);
}
//冒泡排序
for(int i=0; i<9; i++)
{
for(int j=0; j<10-i; j++)
{
if(a[j]>a[j+1])
{
//交换数组的两个元素
int temp;
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
//输出冒泡排序之后的数组
for(int i=0; i<10; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
(3) 使用数组生成斐波那契数列的前20项 并输出
#include<stdio.h>
//前二十个斐波那契数列存入数组 并顺序输出
int main()
{
int sum=0;
//定义一个数组 用来存放斐波那契数列
int a[20];
a[0]=1;
a[1]=1;
//使用数组生成斐波那契数列
for(int i=2; i<=20; i++)
{
a[i]=a[i-1]+a[i-2];
}
//使用循环输出斐波那契数列的前20项
for(int i=0; i<=20; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
二维数组
1.二维数组的声明
数据类型 数组名 [第一维长度][第二维长度]
比如int arr[20][20];char str [20][20];//定义两个第一维长20,第二维长20的不同数据类型的数组arr和str
- 可以在声明数组的时候给数组赋初值
int arr[2][2]={{1,2},{3,4}};char str [2][12]={{'H','E','L','L','O',' ','W','O','R','L','D'},{'A','B','C','D','E','F','G','H','I','J','K'}};
- 如果不赋初值 默认是0
int arr[2][2];printf("%d",arr[0][0]);//此时应输出0;
- 如果声明二维数组的时候赋上初值 则数组第一维长度可以不写,第二维必须写长度
char str [][12]={{'H','E','L','L','O',' ','W','O','R','L','D'},{'A','B','C','D','E','F','G','H','I','J','K'}};
- 如果没有赋上初值 则数组长度必须要写
char str [][2];//是错误的声明方法
char str [][];//也是错误的声明方法
char str [2][2];//是正确的声明方法
- 数组的第一维下标和第二维下标都是从0开始到数组长度-1为止
int i[4][5]
的全部成员如下
行数 | 该行第一个元素 | 该行第二个元素 | 该行第三个元素 | 该行第四个元素 | 该行第五个元素 |
---|---|---|---|---|---|
i[0]行 | i[0][0] | i[0][1] | i[0][2] | i[0][3] | i[0][4] |
i[1]行 | i[1][0] | i[1][1] | i[1][2] | i[1][3] | i[1][4] |
i[2]行 | i[2][0] | i[2][1] | i[2][2] | i[2][3] | i[2][4] |
i[3]行 | i[3][0] | i[3][1] | i[3][2] | i[3][3] | i[3][4] |
可以把每一行看做一个单独的一维数组复合而成
2.二维数组的使用
二维数组的逆序输出
#include<stdio.h>
//1~10存入一个二维数组 并逆序输出
int main()
{
int sum=0;
int a[3][10];
for(int i=0;i<3;i++){
for(int step=0; step<10; step++)
{
a[i][step]=step+1;
}
}
//逆序输出二维数组
for(int i=0;i<3;i++){
for(int step=9; step>=0; step--)
{
printf("%d ",a[i][step]);
}
printf("\n");
}
printf("\n");
return 0;
}
二维数组的行列互换输出
#include<stdio.h>
//1~10存入一个二维数组 并行列互换输出
int main()
{
int sum=0;
int a[3][10];
//1~10赋值到三次的一个一维数组
for(int i=0; i<3; i++)
{
for(int step=0; step<10; step++)
{
a[i][step]=step+1;
}
}
//互换行列输出
for(int step=0; step<10; step++)
{
for(int i=0; i<3; i++)
{
printf("%5d ",a[i][step]);
}
printf("\n");
}
}
多维数组
1.多维数组的定义
数据类型 数组名 [第一维长度][第二维长度]…[第N维长度]
定义一个N维数组
以三维数组为例子
比如int arr[2][2][2];char str [2][2][2];//定义两个第一维长2,第二维长2,第三维长2的不同数据类型的数组arr和str
- 可以在声明数组的时候给数组赋初值
int arr[2][2][2]={{1,2},{3,4},{5,6}};char str [2][2][2]={{'H','E'},{'A','B'},{'C','D'}};
- 如果不赋初值 默认是0
int arr[2][2][2];printf("%d",arr[0][0][0]);//此时应输出0;
- 如果声明多维数组的时候赋上初值 则数组第一维长度可以不写,第二维和后续维度必须写长度
char str [][2][2]={{'H','E'},{'A','B'},{'C','D'}};
- 如果没有赋上初值 则数组长度必须要写
char str [][][];//是错误的声明方法
char str [][][2];//也是错误的声明方法
char str [][2][2];//还是错误的声明方法
char str [2][2][2];//是正确的声明方法
- 数组的第一维下标和第二维下标到第N维下标都是从0开始到数组长度-1为止
- 一般不使用三维及以上维度的数组 一般仅使用一维数组和二维数组
2.多位数组的应用
略
字符数组
1.字符数组的定义
char 字符数组名 [长度]
例如char str [20];//定义长度为20的字符串数组str
- 可以在声明字符数组的时候给字符数组赋初值
char str [2]={'H','E'};char str1 [2]={};//赋初值的两种办法
- 如果不赋初值 可能会导致一系列错误
char arr[2];printf("%c",arr[0]);//此时可能输出'烫','口'等乱码;
- 如果声明字符数组的时候赋上初值 则数组长度可以不写
char str []={'C','A'};
- 如果没有赋上初值 则数组长度必须要写
char str [];//是错误的声明方法
char str [2];//是正确的声明方法
- 字符数组的下标是从0开始到数组长度-1为止
- 正常的字符数组需要以’\0’结尾,但不强制要求,这样规定主要方便使用strcmp,strcpy等函数
- 字符数组赋值后会自动在末尾加\0, 所以定义数组最小长度长度应该比赋值长度大一
char str [2]={'a','b'};
字符数组内元素为str[0]=‘a’,str[1]=‘b’,长度为定义的2,此时末尾无法自动加上’\0’
char str []={'a','b'};
字符数组内元素为str[0]=‘a’,str[1]=‘b’,str[2]=’\0’,长度为3,此时末尾将自动加上’\0’
字符数组的简单示范
#include<stdio.h>
//a~g存入一个字符数组 并顺序输出
int main()
{
int sum=0;
//定义一个字符串str 并手动赋初值 内容全部为'\0'
char str[30] = {};
//定义一个字符串str1 并手动赋初值
char str1[]={'a','b','c','d','e','f','g','\0'};
//根据ASCII码控制循环对str进行赋值
for(int i=0; i<=(int)'g'-(int)'a'; i++)
{
str[i]=(char)((int)('a')+i);
}
//输出两个字符串
printf("%s\n",str);
printf("%s\n",str1);
return 0;
}
2.字符数组的应用
统计字符数组内 非空格的字符有多少个
#include <stdio.h>
#include <string.h>
//从键盘输入一个可能有空格的字符数组 统计非空格的字符有多少
int main()
{
//定义统计字符的变量
int step = 0;
//初始化字符数组str 全部为'\0'
char str[300] = {};
//使用gets可以接受空格 scanf("%s",str);遇到空格会截断
gets(str);
//打印该字符串
printf("str: %s\n", str);
//统计非空格的字符数
//如果该字符为'\0',则表示该字符串结束
for(int i=0; i<300&&str[i]!='\0'; i++)
{
//遇到空格就跳到下一个循环
if(str[i]!=' ')
{
continue;
}
//如果不是空格就统计+1
else
{
step++;
}
}
//输出统计结果
printf("str: %s has %d words\n", str,step);
return 0;
}
3.字符串相关处理函数
常见的字符串相关处理函数有strcmp,strcpy,strcat,strlen,strlwr,strupr
(1)字符串比较函数
strcmp(char str1[],char str2[])
情况 | 返回值 |
---|---|
字符串1等于字符串2 | 0 |
字符串1小于字符串2 | 正整数 |
字符串1大于字符串2 | 负整数 |
(2)字符串复制函数
strcpy(char str1[],char str2[])
将字符串2中的内容复盖到字符串1中去
char str[20],str1[]={'c','h','i','n','a','\0'};strcpy(str,str1);
执行后str中的内容为"china\0\0\0\0\0"
(3)字符串连接函数
strcat(char str1[],char str2[])
将字符串2中的内容复制到字符串1中的尾部去 返回字符串1的首地址
char str[20]={"People's Republic of"},str1[]={"China"};strcat(str,str1);
执行后str中的内容为"People’s Republic of China\0\0\0\0"
(4)字符串长度函数
strlen(char str[])
该函数返回该字符串的真实长度 不包含’\0’
char str[]={'c','h','i','n','a','\0'};printf("%d",strlen(str));
执行后输出str的实际长度5
(5)字符串转换为全小写的字符串
strlwr(char str[])
将字符串中的大写字母全部转换为小写字母
char str[]={'C','H','I','N','A','\0'};printf("%s",strlwr(str));
执行后输出"china"
(6)字符串转换为全小写的字符串
strupr(char str[])
将字符串中的小写字母全部转换为大写字母
char str[]={'c','h','i','n','a','\0'};printf("%s",strupr(str));
执行后输出"CHINA"
常见的字符串处理函数的使用
#include <stdio.h>
#include <string.h>
//字符串操作常见函数
int main() {
char str[30] = {};
char str1[30] = {};
scanf("%s %s", str, str1);
printf("str: %s\n", str);
printf("str1: %s\n", str1);
//strlen 字符串长度函数
printf("str's len: %d\n", strlen(str));
printf("str1's len: %d\n", strlen(str1));
//strcmp 字符串比较函数
int i = strcmp(str, str1);
if (i == 0)
{
printf("str: %s is equals with str: %s\n", str, str1);
}
else
{
printf("str: %s is not equals with str: %s\n", str, str1);
}
//strcpy 字符串复制函数
printf("strcpy\n");
strcpy(str, str1);
printf("str: %s\n", str);
printf("str1: %s\n", str1);
//strcpy 字符串拼接函数
printf("strcat\n");
strcat(str, str1);
printf("str: %s\n", str);
printf("str1: %s\n", str1);
//strlwr 对str 转化为小写字母
printf("strlwr with str\n");
printf("str to lower: %s\n", strlwr(str));
//strupr 对str1 转化为大写字母
printf("strupr with str\n");
printf("str1 to upper: %s\n", strupr(str1));
return 0;
}
小结
- 简要的介绍了一维数组和多维数组,字符数组以及字符数组的相应库函数
- 不同的数组也有擅长的问题领域 应该根据问题的定义来选择合适的数组 甚至有些问题不适合用数组解决