C语言中的数组

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等于字符串20
字符串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;
}

小结

  • 简要的介绍了一维数组和多维数组,字符数组以及字符数组的相应库函数
  • 不同的数组也有擅长的问题领域 应该根据问题的定义来选择合适的数组 甚至有些问题不适合用数组解决
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值