嵌入式学习DAY6 --- 一维数组字符串处理相关的函数、二维数组讲解、指针初步讲解!

嵌入式入门学习笔记,遇到的问题以及心得体会!
DAY6

概括:
一,字符串处理相关的函数:
1,strlen
2,strcpy(strncpy)
3,strcat(strncat)
4,strcmp(strncmp)
二,二维数组
数组的特点:
(1)数据类型相同
(2)内存连续

如何定义一个一维数组?
存储类型 数据类型 数组名[元素个数];
如何定义一个二维数组?
存储类型 数据类型 数组名[行数][列数];

三、指针:

地址:内存单元的编号(内存都是以字节为单位进行划分,以编号的形式来代表每一个字节在内存中的位置)
指针:因为一个编号(地址)对应一个独立的字节空间,有这种指向关系存在,所以形象的把地址也称为指针

笔记:

一维字符数组:本质:就是一个字符串
一,字符串处理相关的函数:
1,strlen
2,strcpy(strncpy)
3,strcat(strncat)
4,strcmp(strncmp)


(1)strlen :
函数功能:求字符串长度的函数

#include <string.h> //头文件
//函数原型:
size_t strlen(const char *s);

简易版:
int strlen(数组名);

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	char str[20] = {0};
	gets(str);

	//int len_str = strlen(str);
	//printf("len_str = %d\n",len_str);
	printf("len_str= %d\n",strlen(str));
	return 0;
}


(2)strcpy: 复制字符串

#include <string.h>

char *strcpy(char *dest, const char *src);

char *strncpy(char *dest, const char *src, size_t n);

简化版:
strcpy(数组名1,数组名2);----》将数组2中的内容复制到数组1中去

#include <stdio.h>
#include <string.h>

#define M 20
#define N 10
int main(int argc, const char *argv[])
{
	//实现字符串之间的拷贝
	char str1[M] = {'\0'};
	char str2[N] = {0};

	printf("请输入两个字符串:\n");
	gets(str1);
	scanf("%s",str2);

	printf("before: str1 = %s\n",str1);
	
	printf("请输入需要拷贝的字符的个数:\n");
	int count;
	scanf("%d",&count);
	//越界检查
	if(count + 1 > M)
	{
		printf("str1 is so short!\n");
		return -1;//-1一般代表程序异常退出
	}
	strncpy(str1,str2,count);
	printf("after: str1 = %s\n",str1);
	return 0;//0代表成功正常退出
}

strncpy(数组名1,数组名2,N) ;–>将数组2中的前N个字符内容复制到数组1中去

#include <stdio.h>
#include <string.h>

#define M 20
#define N 10
int main(int argc, const char *argv[])
{
	//实现字符串之间的拷贝
	char str1[M] = {'\0'};
	char str2[N] = {0};

	printf("请输入两个字符串:\n");
	gets(str1);
	scanf("%s",str2);

	printf("before: str1 = %s\n",str1);
	
	printf("请输入需要拷贝的字符的个数:\n");
	int count;
	scanf("%d",&count);
	//越界检查
	if(count + 1 > M)
	{
		printf("str1 is so short!\n");
		return -1;//-1一般代表程序异常退出
	}
	strncpy(str1,str2,count);
	printf("after: str1 = %s\n",str1);
	return 0;//0代表成功正常退出
}


(3)strcat :连接字符串函数
#include <string.h>

char *strcat(char *dest, const char *src);

char *strncat(char *dest, const char *src, size_t n);
简易版:
strcat(数组名1,数组名2);–》将数组2中的字符连接在数组1的后面
strncat(数组名1,数组名2,N);—》将数组2中前N个字符连接在数组1的后面

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	char str1[20] = {0};
	char str2[10] = {0};

	gets(str1);
	gets(str2);

	printf("连接之前:str1 = %s\n",str1);

	//越界检查
	if(20 < strlen(str1) + strlen(str2) + 1)
	{
		printf("str1 is so short!\n");
		return -1;
	}

	strcat(str1,str2);

	printf("连接之后:str1 = %s\n",str1);
	return 0;
}


(4)strcmp : 比较函数
#include <string.h>

int strcmp(const char *s1, const char *s2);

int strncmp(const char *s1, const char *s2, size_t n);

简易版:
int strcmp(数组名1,数组名2);

比较规则:
取两个字符串中第一对字符进行比较:
此时如果第一对字符相等,则进行判断下一对字符,如果该对字符不相等,则因为ASCII值的存在,就会有正负之分

对于该函数的返回值:
当返回值 == 0时,代表两个字符串相等
当返回值大于0时,代表数组1 > 数组2
当返回值小于0时,代表数组1 < 数组2

#include <stdio.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	char str1[20] = {0};
	char str2[10] = {0};

	gets(str1);
	gets(str2);

	int count;
	printf("请输入:\n");
	scanf("%d",&count);
	int Value = strncmp(str1,str2,count);
	if(0 == Value)
	{
		printf("str1 == str2!\n");
	}
	else if(Value > 0)
	{
		printf("str1 > str2!\n");
	}
	else
	{
		printf("str1 < str2!\n");
	}
	return 0;
}


二,二维数组
数组的特点:
(1)数据类型相同
(2)内存连续

如何定义一个一维数组?
存储类型 数据类型 数组名[元素个数];
如何定义一个二维数组?
存储类型 数据类型 数组名[行数][列数];

要求:定义一个2行3列的整形二维数组?
—》int arr[2][3] = {1,2,3,4,5,6};
1 2 3
4 5 6

#include <stdio.h>

#define M 2
#define N 3
int main(int argc, const char *argv[])
{
	int arr[M][N] = {{1},{4,5}};

	//定义两个循环变量
	int i,j;
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
		

	printf("输出为:\n");
	//第一个for循环用来控制行数
	for(i=0;i<M;i++)
	{
		//第二个for循环用来控制每一行中元素的个数
		for(j=0;j<N;j++)
		{
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

总结:
二维数组的行数:代表包含一维数组的个数
二维数组的列数:代表包含的每一个一维数组中元素的个数

注意:二维数组额行数可以省略不写,但是列数不可以省略!!!


二维字符数组:

定义一个可以存放三个字符串的二维字符数组?

----》char str[3][20] = {{‘h’,‘a’,‘h’,‘a’},{‘x’,‘i’,‘x’,‘i’},{‘G’,‘a’,‘G’,‘a’}};
char str[3][20] = {{“haha”},{“xixi”},{“GaGa”}};
char str[3][20] = {“haha”,“xixi”,“GaGa”};

#include <stdio.h>

int main(int argc, const char *argv[])
{
	char str[3][20] = {"wangjia","haha","GaGa"};

	int i;

	printf("请输入:\n");
	for(i=0;i<3;i++)
	{
		gets(str[i]);
	}
	//用该循环来控制所需要打印的字符串的个数
	for(i=0;i<3;i++)
	{
		puts(str[i]);
	}
	return 0;
}


指针:

地址:内存单元的编号(内存都是以字节为单位进行划分,以编号的形式来代表每一个字节在内存中的位置)
指针:因为一个编号(地址)对应一个独立的字节空间,有这种指向关系存在,所以形象的把地址也称为指针


指针:
可以分为指针常量和指针变量
指针常量:就是内存中的一个编号 —》不能自加和自减
指针变量:专门用来存储地址的一类变量 --》可以自加和自减

如何定义一个指针变量?
—》存储类型 数据类型 *指针变量名;
分析:
存储类型:该指针变量自身的存储类型
数据类型:指针所指向(目标)类型
数据类型 * :指针自身的数据类型
指针变量名:表示该指针在内存中的空间的名字

注意: 指针定义格式中的*只是一个标识符,标识当前这个变量是一个用来存储地址的一类变量,而不是普通变量

如何确定指针一次性访问空间大小?
----》由指针所指向的类型来决定
int *p —>p一次性访问4个字节
char *p —>p一次性访问1个字节

作业:
(1)自己实现strcpy,strcat,strcmp

1.实现strcat

#include <stdio.h>

#define M 20
#define N 10

int main(int argc, const char *argv[])
{
	//实现strcat的功能
	char str1[M] = {'\0'};
	char str2[N] = {'\0'};

	printf("请输入:\n");
	gets(str1);
	gets(str2);
	//定义两个循环变量
	int i = 0,j = 0;
	//第一步:遍历str1字符串到第一个'\0'位置处
	
	/*while(str1[i])
	{
		i++;
	}*/
	while(str1[i++]);

	i--;
	//第二步:遍历str2字符串,并将每一个有效字符赋值在str1的后面
	while(str2[j])
	{
		str1[i++] = str2[j++];
		//i++;
		//j++;
	}
	printf("连接之后的str1 = %s\n",str1);
	return 0;
}

2.实现strcpy

#include <stdio.h>

#define M 20
#define N 10
int main(int argc, const char *argv[])
{
	//实现两个字符串之间的拷贝
	char str1[M] = {'\0'};
	char str2[N] = {'\0'};

	printf("请输入两个字符串:\n");
	gets(str1);
	gets(str2);

	int i = 0;
	//遍历str2这个字符串,并将每一个有效字符赋值给str1对应的位置
	while(str2[i])
	{
		str1[i] = str2[i];
		i++;
	}
	//手动添加'\0'
	str1[i] = '\0';

	printf("复制之后的str1 = %s\n",str1);
	return 0;
}

3.实现strcmp

#include <stdio.h>

#define M 20
#define N 10

int main(int argc, const char *argv[])
{
	//实现strcmp的功能
	char str1[M] = {'\0'};
	char str2[N] = {'\0'};

	printf("请输入:\n");
	gets(str1);
	gets(str2);

	int i;
	for(i=0;str1[i] == str2[i];i++)
	{
		if('\0' == str1[i])
		{
			printf("str1 == str2!\n");
			return 0;
		}
	}
	int Value = str1[i] - str2[i];
	if(Value > 0)
	{
		printf("str1 > str2!\n");
	}
	else
	{
		printf("str1 < str2!\n");
	}
	return 0;
}

(2)事先杨辉三角的打印
1
1 1
1 2 1
类似于这种金字塔的样子进行输出

#include <stdio.h>

#define N 20

int main()
{
	int a[N][N]={0};
	int i,j,k,n=0;

	printf("请输入杨輝三角的行数:\n");
	scanf("%d",&n);

	for(i=0;i<n;i++)
	{
		for(j=0;j<=i;j++)
		{
			if(j == 0 || i == j)
			{
				a[i][j] = 1;
			}
			else
			{
				a[i][j] = a[i-1][j-1] + a[i-1][j];
			}
		}
	}
	printf("%d行杨輝三角的图形如下:\n",n);
	for(i=0;i<n;i++)
	{
		for(k=0;k<n-1-i;k++)
		{
			printf(" ");
		}
		for(j=0;j<=i;j++)
		{
			printf("%d ",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值