c语言数组复习

·

1、一维数组

----------(1)、键盘输入 10 个数,求最大值和最小值(最简单的方法)

在这里插入图片描述
在这里插入图片描述

----------(2)、数组的逆置

#include<stdio.h>
void test01() {
	int arr[10] = { 0 };
	int n = sizeof(arr) / sizeof(arr[0]);
	int i;
	printf("请输入 %d 个数:", n);
	for (i = 0; i < n; i++) {
		scanf_s("%d", &arr[i]);
	}
	int low = 0;
	int high = n - 1;
	int temp; //中间变量
	while (low < high) {       //交换数组
		temp = arr[low];
		arr[low] = arr[high];
		arr[high] = temp;
		low++;
		high--;
	}
	printf("交换后的数组打印如下:");
	for (i = 0; i < n; i++) {
		printf("%d\t", arr[i]);
	}
}
int main() {
	test01();
	return 0;
}

在这里插入图片描述

2、二维数组

----------(1)、二维数组概述

二维数组本身就是数组的数组(站在编译器的角度分析问题)

int arr[3][4]                    

在这里插入图片描述

二维数组的总大小:行数 * 列数 * 每个元素的大小
数组的总大小:sizeof(arr)
行数:sizeof(arr)/sizeof(arr[0])                                   //总大小除以每一行的大小就是行数,sizeof(arr[0]) 每一行的大小,arr[0]行的数组名
列数:sizeof(arr[0)/sizeof(arr[0][0])                              //一行的大小,除以每一个元素的大小,就是列数

----------(2)、二维数值数组的初始化

------------------、分段初始化

//完全初始化
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};
//如果完全初始化。,可以省略行数
int arr[][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};
//部分初始化
int arr[3][4] = { {1,2},{5,6},{9,10,11}};

------------------、连续初始化

//完全初始化
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//如果完全初始化。,可以省略行数
int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
//部分初始化
int arr[3][4] = {1,2,5,6,9,10,11};

3、一维字符数组

----------(1)、一维字符数组初始化

------------------、追个元素初始化(不推荐)

int arr[5] = {'h','e','l','l','o'};   //使用这种方式系统在编译的时候不会自动加'\0'

------------------、使用字符串的方式初始化一维数组(推荐)

int arr[6] = "hello";       //使用这种方式,数组的长度一定要大于字符串的长度,因为使用这种方式系统会自动在字符串后面加入 '\0',若数组的长度等于字符串的长度,那么编译的时候系统自动加入 '\0'会导致溢出

在这里插入图片描述

----------(2)、字符数组遍历

------------------、使用 for 循环遍历(逐个字符遍历)

int arr[6] = "hello";       //使用这种方式,数组的长度一定要大于字符串的长度,因为使用这种方式系统会自动在字符串后面加入 '\0',若数组的长度等于字符串的长度,那么编译的时候系统自动加入 '\0'会导致溢出
int i;
for(i = 0;i<n;i++){
    printf("%c",arr[i]);
}

------------------、直接使用 %s 输出字符串,需要字符串的首元地址,遇见 '\0’会停止

int arr[6] = "hello";       //使用这种方式,数组的长度一定要大于字符串的长度,因为使用这种方式系统会自动在字符串后面加入 '\0',若数组的长度等于字符串的长度,那么编译的时候系统自动加入 '\0'会导致溢出
printf("%s",arr);    //arr是数组名,代表的是首元地址,一个一个输出直到遇见 '\0'停止

------------------、使用printf(“%s”,arr)可以输出int arr[5] = {‘h’,‘e’,‘l’,‘l’,‘o’}; 定义的数组嘛?(面试问题)

不能,由于逐个元素初始化没有’\0’,所以使用 %s 容易造成非法访问内存!!!!!!!!!!
解决方法是:如果硬要使用printf(“%s”,arr)输出int arr[5] = {‘h’,‘e’,‘l’,‘l’,‘o’}; 定义的数组,就要这样定义:int arr[6] = {‘h’,‘e’,‘l’,‘l’,‘o’};,使用这种方式定义字符数组(数组的长度大于字符串的长度),那么arr[5] = 0,等价于 arr[5] = ‘\0’,因为‘\0’的ASCII值就是 0,所以就不会造成非法访问!!!!!!!!!!!
在这里插入图片描述

------------------、strlen和sizeof的区别

在这里插入图片描述

在这里插入图片描述

----------(3)、键盘获取字符数组

------------------、使用scanf和 %s输入字符串,遇见空格 回车 停止输入(所以可用于以空格切割字符串)

在这里插入图片描述

------------------、使用gets输入字符串(gets在获取键盘输入的时候 不会判断目的空间的大小 容易造成越界)建议别用

gets可以看获取字符串的空格 ,但是不会获取回车

在这里插入图片描述

------------------、fgets 可以获取带空格的字符串而且安全

在这里插入图片描述

在这里插入图片描述

------------------、fgets 的结束条件:fgets会获取带空格的字符串,遇到回车(达到空间最大值之前)会结束获取,但是同时也会提取回车换行符!!!!!!!!!!!

在这里插入图片描述

------------------、消除获取的回车

char str[128] = "";
	printf("请输入字符串:");
	fgets(str, sizeof(str),stdin);    //stdin终端输入
	str[strlen(str) - 1] = 0;         //消除回车,将回车的地方获取回车元素并且赋值为'\0'
	printf("输出结果:##%s##", str);

在这里插入图片描述

----------(4)、字符串的追加

void test06() {
	char str1[128] = "hello";
	char str2[128] = "world";
	int i = 0;
	while(str1[i] && ++i);       //str[i] == '\0'的话,即为 str[i] == 0 是假,i++的时候当 i = 0的时候 i++为false,所以要为++i修改值为1,再判断循循环
	//将str2的每一个字符复制到
	int j = 0;
	while (str2[j] != '\0') {
		str1[i] = str2[j];
		i++;
		j++;
	}
	str2[i] = '\0';              //str2[i] = '\0';是赋值结束符
	printf("将str2复制str1的末尾是:%s", str1);
}

int main() {
	test06();
	return 0;
}

在这里插入图片描述

----------(5)、字符串的查找


void test09() {
	char str[128] = "";
	printf("请输入字符串:");
	fgets(str, sizeof(str), stdin);    //stdin终端输入
	str[strlen(str) - 1] = 0;         //消除回车,将回车的地方获取回车元素并且赋值为'\0'
	printf("请输入要查找的字符串:");
	char ch = getchar();
	int i = 0;
	while (str[i] != '\0') {
		if (str[i] == ch) {
			printf("查找成功:%d", i);
			break;
		}
		i++;
	}
	if (str[i] == '\0') {
		printf("查找失败!!!\n");
	}
}

int main() {
	test09();
	return 0;
}

在这里插入图片描述
在这里插入图片描述

----------(6)、从键盘输入第一个字符串str1,再从键盘输入第二个字符串str2,在输入pos位置,将第二个字符串str1按照位置pos插入到str1中

#include<stdio.h>
#include <string.h>
void test10() {
	char str1[128] = "";
	printf("请输入字符串str1:");
	fgets(str1, sizeof(str1), stdin);    //stdin终端输入
	str1[strlen(str1) - 1] = 0;          //消除回车,将回车的地方获取回车元素并且赋值为'\0'

	char str2[128] = "";
	printf("请输入字符串str2:");
	fgets(str2, sizeof(str2), stdin);    //stdin终端输入
	str2[strlen(str2) - 1] = 0;          //消除回车,将回车的地方获取回车元素并且赋值为'\0'

	int pos = 0;                         //插入位置
	printf("请输入要插入的位置:");
	scanf_s("%d", &pos);

	int str2_len = 0;                    //定义str2字符串的长度标识符
	while(str2[str2_len] && ++str2_len);//计算str2的长度
	
	int i = 0;                           //将 i 定位到str1的尾部
	while (str1[i] && ++i);

	int j = 0;                           //str2的下标
	if (pos < 0 || pos > i) {
		printf("输入插入位置 %d 不合法\n",pos);
		return;                          //结束函数
	}
	else {
		while (i >= pos)
		{
			str1[i + str2_len] = str1[i]; //从pos位置移动str2长度的字符串1
			i--;
		}                                    
		while (str2[j] != '\0') {         //从pos位置将str2插入到str1中
			str1[pos] = str2[j];
			pos++;
			j++;
		}
	}
	printf("将str2插入到str1之后的结果是:%s", str1);
}
int main() {
	test10();
	return 0;
}

在这里插入图片描述

----------(7)、字符串数组必须使用 字符串操作函数 进行操作,而不能直接给字符串数组再次赋值之类

在这里插入图片描述

4、二维字符数组

----------(1)、输出二维字符数组

#include <stdio.h>
#include <string.h>
void test00()
{
    char arr[5][128] = {"hello", "ml", "hhh", "nnn", "tttt"};
    int row = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    // 遍历二维数组
    for (i = 0; i < row; i++)
    {
        // 其中arr[row]代表的是每一行字符串的首地址
        printf("打印的字符串如下:%s\n", arr[i]);
    }
}
int main()
{
    test00();
    return 0;
}

在这里插入图片描述

----------(2)、控制台输入输出二维字符数组

void test01()
{
    char arr[5][128] = {""}; // 第一个赋值为'\0,其余为0
    int row = sizeof(arr) / sizeof(arr[0]);
    int col = sizeof(arr[0]) / sizeof(arr[0][0]);
    // 控制台输入二维字符数组
    int i = 0;
    printf("请输入 %d 字符串:", row);
    for (i = 0; i < row; i++)
    {
        scanf("%s", arr[i]);
    }

    // 遍历二维数组
    for (i = 0; i < row; i++)
    {
        // 其中arr[row]代表的是每一行字符串的首地址
        printf("打印的字符串如下:%s\n", arr[i]);
    }
}

int main()
{
    test01();
    return 0;
}

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Q渡劫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值