嵌入式工程师学习第六天——字符串函数&二维字符数组

        今天学习了字符串的函数,这些函数很大程度上减少了我们代码的消耗,不用再多写循环去计算长度,比较大小也可以直接进行比较了。此外我们还在这些的基础上学习了二维的字符数组,其实二维字符数组跟一维没什么区别,完全可以按照一维的计算方式去计算二维数组。下面是今天的脑图:

一、字符串函数

课堂上有很多关于字符串函数的练习,我在这里列举一下,都是很简单的练习就不贴代码了。

1.strlen的练习:

        计算变量的长度

        计算常量的长度

        使用非函数方法计算字符串长度

2.strcmp的练习:

        定义3个字符串,计算最大值【两个参数都为变量】

        输入一个字符串,【和常量进行比较】

        使用非函数计算字符串比较

3.strcpy的练习:

        实现两个字符串交换

        两个变量实现拷贝

        变量和常量实现拷贝

        非函数实现拷贝

4.strcat的练习:

        实现把str1连接到str2的后面,在把str2连接str3后面

        实现把 "华清远见"连接到str的后面

        使用非函数实现

二、二维字符数组

        怎么定义我就不说了,脑图上有,二维字符数组唯一要注意的就是它的一行怎么表示,搞清楚这个就跟一维数组一样了。

        练习题:

        1.对二维数组冒泡冒泡

char a[5][50];
	int i,j;
	for(i=0;i<5;i++)
	{
		scanf("%s",a[i]);
	}
	//冒泡
	int count=0;
	char t[50];
	for(i=1;i<5;i++)
	{
		count=0;//计算交换的次数
		for(j=0;j<5-i;j++)
		{
			if(strcmp(a[j],a[j+1])<0)
			{
				strcpy(t,a[j]);
				strcpy(a[j],a[j+1]);
				strcpy(a[j+1],t);
				count++;
			}
		}
		if(count==0)
			break;
	}
	//输出
	for(i=0;i<5;i++)
	{
		printf("%s\t",a[i]);
	}

        2.计算二维字符数组的最大字符串 strcmp

char a[3][20]={"dfsagdhf","rwtey","rtyu"};
	int i;
	char max[20]=""; //解决乱码
	for(i=0;i<3;i++)
	{
		if(i==0) //第一次循环
			strcpy(max,a[i]);
		if(strcmp(max,a[i])<0)//if(max<a[i])
		{	
			strcpy(max,a[i]);
		}
	}
	
	printf("最大值是:%s\n",max);

        3.计算二维字符数组的最长字符串strlen

char a[3][20]={"dfsagdhf","rwtey","rtyu"};

		int i;
	char max[20]=""; //解决乱码
	for(i=0;i<3;i++)
	{
		if(i==0) //第一次循环
			strcpy(max,a[i]);
		if(strlen(max)<strlen(a[i]))//if(max<a[i])
		{	
			strcpy(max,a[i]);
		}
	}
	
	printf("最长值是:%s 长度是:%ld\n",max,strlen(max));

        4.将m行n列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。

	char a[3][5]={"asd","wert","tyuio"};
	char str[20]="";
	int k=0;
	for(int i=0;i<5;i++)
	{
		for(int j=0;j<3;j++)
		{
			if(a[j][i]!='\0')
				str[k++]=a[j][i];
		}
	}
	printf("str=%s\n",str);

        5.输入一个字符串key,查找key是否在二维数组中出现

char a[5][5]={"aaaa","aana","aaja","dddd","eeee"};
	char key[]="aaaa";
	int count=0,xb1,xb2;
	for(int i=0;i<5;i++)
	{
		if(strcmp(a[i],key)==0)
		{
			count++;//计算key出现的次数
			if(count==1)
				xb2=i;
			xb1=i;//2 4 5
		}
	}
	if(count==0)
	{
		printf("不存在\n");
	}
	else if(count==1)
	{
		printf("在%d出\n",xb1);
	}
	else{
		printf("第一次%d  最后一次:%d\n",xb2,xb1);
	}

        6.对二维字符数组每个字符串实现简单选择排序

char a[5][5]={"aaaa","aana","aaja","dddd","eeee"};
	int i,j,mini;
	char t[5]="";
	for(i=0;i<5-1;i++)
	{
		mini=i;
		for(j=i+1;j<5;j++)
		{
			if(strcmp(a[mini],a[j])>0)
			{
				mini=j;
			}
		}
		if(mini!=i)//交换
		{
			strcpy(t,a[mini]);
			strcpy(a[mini],a[i]);
			strcpy(a[i],t);
		}
	}

	for(i=0;i<5;i++)
	{
		printf("%s\t",a[i]);
	}

以上练习题都需要活用字符串函数,有了这些函数再做这些题就很简单了。

day6作业

1.实现字符串逆置

例如:char a[]=”hello     my    student”

输出:student    my    hello

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

int main(int argc, const char *argv[])
{
	char a[] = "hello my students";
	int n = strlen(a);
	int left = 0;
	int right = n - 1;
	while(left < right){
		char mid[3] = "\0";
		mid[0] = a[left];
		a[left] = a[right];
		a[right] = mid[0];
		left ++;
		right --;
	}
	int left2 = 0;
	int right2 = 0;
	int type = 0;
	for(int i = 0; i < n; i ++){
		if((a[i] == ' ' || i == n - 1) && type == 0){
			right2 = i - 1;
			int left3 = left2;
			int right3 = right2;
			if(i == n - 1){
				right3 = i;
			}
			while(left3 < right3){
				char mid2[3] = "\0";
				mid2[0] = a[left3];
				a[left3] = a[right3];
				a[right3] = mid2[0];
				left3 ++;
				right3 --;
			}
			type = 1;
		}
		if(type == 1 && a[i] != ' '){
			type = 0;
			left2 = i;
		}
	}
	puts(a);
	return 0;
}

结果如下:

 

2.使用非函数方法实现字符串比较

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

int main(int argc, const char *argv[])
{
	char a[10] = "\0";
	char b[10] = "\0";
	printf("请输入2个字符串\n");
	scanf("%s %s",a,b);
	getchar();
	int na = strlen(a);
	int nb = strlen(b);
	if(na != nb){
		printf("2个字符串不相同\n");
		return 0;
	}
	for(int i = 0; i < na ; i ++){
		if(a[i] != b[i]){
			printf("2个字符串不相同\n");
			return 0;
		}
	}
	printf("2个字符串相同\n");
	return 0;
}

结果如下:

 

3.使用非函数方法实现字符串连接

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

int main(int argc, const char *argv[])
{
	char a[20] = "\0";
	char b[20] = "\0";
	printf("输入2个字符串\n");
	scanf("%s %s",a,b);
	int na = strlen(a);
	int nb = strlen(b);
	for(int i = 0; i < nb; i ++){
		a[na ++] = b[i];
	}
	printf("连接后的结果是\n%s\n",a);
	return 0;
}

结果如下:

 

4.打印m行n列的杨辉三角

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

int main(int argc, const char *argv[])
{
	int a[10][10];
	int n2 = 10;
	int n,m;
	printf("请输入要打印几行几列\n");
	scanf("%d %d",&m,&n);
	for(int i = 0; i < m; i ++){
		for(int w = 0; w < n2; w ++){
			printf("  ");
		}
		for(int j = 0; j < n; j ++){
			if(j > i){
				break;
			}
			if(i == j || j == 0){
				a[i][j] = 1;
				printf("%4d",a[i][j]);
			}else{
				a[i][j] = a[i-1][j] + a[i-1][j-1];
				printf("%4d",a[i][j]);
			}
		}
		n2 --;
		printf("\n");	
	}

	return 0;
}

结果如下:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值