嵌入式学习第八天!(字符串常见操作、二维字符数组和函数)

发布时间:2024年01月25日

1. 字符串常见操作:

? ? ? ? 1. strlen:

? ? ? ? ? ? ? ? 获得字符串的长度

? ? ? ? ? ? ? ? 练习:定义一个数组str,从终端接收一个字符串存入str数组中,并计算数组中字符串的长度(不能使用strlen)

#include <stdio.h>

int main(void)
{
	char str[32] = {0};
	int i = 0;
	int num = 0;
	
	gets(str);

	while(str[i] != '\0')
	{
		num++;
		i++;
	}

	printf("stringlen = %d\n",num);

	return 0;
}

? ? ? ? 2. strcpy:

? ? ? ? ? ? ? ? 字符串的拷贝:

? ? ? ? ? ? ? ? 注意:

? ? ? ? ? ? ? ? ? ? ? ? 1. 目的空间一定要足够大,存放的下源字符

? ? ? ? ? ? ? ? 练习:定义两个数组src和dst,从终端接收一个字符串存入,src数组中,并将src中的字符串拷贝到dst中(不能使用strcpy)

#include <stdio.h>

int main(void)
{
	char str[32] = {0};
	char dst[32] = {0};
	char i = 0;
	
	gets(str);

	while(str[i] != '\0')
	{
		dst[i] = str[i];
		i++;
	}
	
	printf("str = %s\n",str);	
	printf("dst = %s\n",dst);

	return 0;

}

????????3. strcat:

? ? ? ? ? ? ? ? 字符串的拼接,在第一个字符串末尾拼接上第二个字符串

? ? ? ? ? ? ? ? 注意:

? ? ? ? ? ? ? ? ? ? ? ? 1. 第一个字符串要空间足够大

? ? ? ? ? ? ? ? 练习: 定义两个数组str1和str2,从终端接收两个字符串存入str1和str2中,并将str2字符串拼接到str1的末尾(不能使用strcat)

#include <stdio.h>

int main(void)
{
	char str1[32] = {0};
	char str2[32] = {0};
	int i = 0;
	int j = 0;
	
	gets(str1);
	gets(str2);

	while(str1[i] != '\0')
	{
		i++;
	}

	while(str2[j] != '\0')
	{
		str1[i+j] = str[j];
		j++;
	}
	
	printf("str1 = %s\n",str1);
	printf("str2 = %s\n",str2);

	return 0;
}

? ? ? ? 4. strcmp:

? ? ? ? ? ? ? ? 字符串的比较:

? ? ? ? ? ? ? ? 如果两个字符串相同,结果为0;

????????????????如果第一个字符串 > 第二个字符串,结果为 > 0 的值

????????????????如果第一个字符串 < 第二个字符串,结果为 < 0 的值

? ? ? ? ? ? ? ? 两个字符串比较,从左到右每个字符进行比较,不相同的字符,谁的ASCII码值大,字符串就大

? ? ? ? ????????练习:定义两个数组str1和str2,从终端接收两个字符串存入,str1和str2中,比较str1和str2的大小(不能使用strcmp)

#include <stdio.h>

int main(void)
{
	char str1[32] = {0};
	char str2[32] = {0};
	int i = 0;
	int result = 0;
	
	gets(str1);
	gets(str2);

	while(str1[i] == str2[i] && str1[i] != '\0')
	{
		i++;
	}

	result = str1[i] - str2[i];

	printf("strcmp = %d\n",result);

	return 0;
}

2. 二维字符型数组:

? ? ? ? 1. 定义:

数据类型 数组名[行数][列数];
char str[5][32];

? ? ? ? 2. 存储:

? ? ? ? ? ? ? ? 1. 连续性? 2. 有序性;

? ? ? ? 3. 初始化:

? ? ? ? ? ? ? ? 1. 局部初始化:

char str[5][32] = {
    {'h', 'e', 'l', 'l', 'o', '\0'},
    {'w', 'o', 'r', 'l', 'd', '\0'},
    {'h', 'o', 'w', '\0'},
    {'a', 'r', 'e', '\0'},
    {'y', 'o', 'u', '\0'},
};

char str[5][32] = {
    {"hello"},
    {"world"},
    {"how"},
    {"are"},
    {"you"}
};

char str[5][32] = {"hello", "world", "how", "are", "you"};

char str[5][32] = {0};

3. 函数:

? ? ? ? 特性:1. 避免重复性代码

? ? ? ? ? ? ? ? ? ?2. 程序代码模块化

? ? ? ? 1. 函数的定义:

函数类型  函数名(数据类型1 形式参数1, 数据类型2 形式参数2, ...)
{
    函数体;

    return 返回值;
}

? ? ? ? ? ? ? ? 函数类型:函数运行结果的类型(int float double char void)?
? ? ? ? ? ? ? ? ????????1.函数类型如果不写,默认为int类型
? ? ? ? ? ? ? ? ????????2.函数返回值缺省,应该写void类型
? ? ? ? ? ? ? ? ????????3.函数类型应该与返回值的类型一致,如果不一致以函数类型为准

? ? ? ? ? ? ? ? 函数名:

????????????????????????1.由字母、数字和下划线构成,不能以数字开头
????????????????????????2.不要与C语言关键字重名
????????????????????????3.最好不要与C语言库函数重名
????????????????????????4.最好见名知意(动宾形式)
????????????????????????????????GetMaxNum、GetMinNum、GetAvgScore 、DownLoadFile?

? ? ? ? 2. 函数的调用:

函数名(实际参数1, 实际参数2, ...);

? ? ? ? ? ? ? ? 注意:

????????????????????????1.实参个数必须与形参个数一一对应
????????????????????????2.实参可以是常量、变量、或者表达式
????????????????????????3.函数调用时会发生实参向形参空间的拷贝,实参将值拷贝给形参(一一对应),实参类型与形参类型不一致时,将实参类型默认转换为形参类型

????????????????练习:?封装4个函数 Add Sub Mul Div ,从终端接收2个数,调用4个函数打印出四则运算的结果。

#include <stdio.h>



int Add(int a, int b)
{
	return a + b;
}

int Sub(int a, int b)
{
	return a - b;
}

int Mul(int a, int b)
{
	return a * b;
}

double Div(double a, double b)
{
	return a / b;
}


int main(void)
{
	int x = 0;
	int y = 0;
	int add = 0;
	int sub = 0;
	int mul = 0;
	double div = 0;

	scanf("%d",&x);
	scanf("%d",&y);

	add = Add(x,y);
	sub = Sub(x,y);
	mul = Mul(x,y);
	div = Div(x, y);

	printf("add = %d\n",add);
	printf("sub = %d\n",sub);
	printf("mul = %d\n",mul);
	printf("div = %.2lf\n",div);

	return 0;

}

? ? ? ? 3. 函数的声明:

? ? ? ? ? ? ? ? 定义:定义需要为变量开辟空间

? ? ? ? ? ? ? ? 声明:该变量是存在的,不需要开辟空间

????????????????如果被调函数的定义在主调函数的下方,需要对被调函数声明一下

作业:

? ? ? ? 封装三个函数:

? ? ? ? ? ? ? ? 函数1,传入年份,获得该年是闰年还是平年,闰年返回1,平年返回0

? ? ? ? ? ? ? ? 函数2,传入年 月 日信息,打印出这一天是该年的第几天

????????????????函数3,传入年 月 日信息,打印该年剩余多少天

? ? ? ? ? ? ? ? (提示:函数2嵌套函数1,函数3嵌套函数2)

#include <stdio.h>

#include <stdio.h>

int IsLeepYear(int Year)
{
	int Ret = 0;
	if((Year % 400 == 0) || (Year % 4 == 0 && Year % 100 != 0))
	{
		Ret = 1;
	}
	return Ret;
}

int GetDayOfYear(int Year, int Mon, int Day)
{
	int i = 0;
	int NowDay = 0;

	for(i=1; i < Mon; i++)
	{
		if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12)
		{
			NowDay += 31;
		}
		else if(i==4 || i==6 || i==9 || i==11)
		{
			NowDay += 30;
		}
		else if(i==2 && IsLeepYear(Year))
		{
			NowDay += 29;
		}
		else if(i==2 && !IsLeepYear(Year))
		{
			NowDay += 28;
		}
	}
	NowDay += Day;

	return NowDay;
}

int GetLeftDayOfYear(int Year,int Mon,int Day)
{
	int RemDay = 0;
	if(IsLeepYear(Year))
	{
		RemDay = 366 - GetDayOfYear(Year, Mon, Day);
	}
	else
	{
		RemDay = 365 - GetDayOfYear(Year, Mon, Day);
	}
}

int main(void)
{
	int year = 0;
	int mon = 0;
	int day = 0;
	int ret = 0;
	int NowDay = 0;
	int RemDay = 0;
	
	printf("请输入年 月 日: \n");
	scanf("%d%d%d", &year, &mon, &day);
	
	ret = IsLeepYear(year);
	NowDay = GetDayOfYear(year, mon, day);
	RemDay = GetLeftDayOfYear(year, mon, day);

	if(ret == 1)
	{
		printf("%d年%d月%d日,是闰年\n",year,mon,day);
	}
	else
	{
		printf("%d年%d月%d日,是平年\n",year,mon,day);
	}

	printf("%d年%d月%d日,是%d年的:第%d天,还剩下:%d天\n"
			,year,mon,day,year,NowDay,RemDay);

	return 0;
}

文章来源:https://blog.csdn.net/weixin_52799506/article/details/135790102
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。