获得字符串的长度
练习:定义一个数组str,从终端接收一个字符串存入str数组中,并计算数组中字符串的长度(不能使用strlen)
#include
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;
}
字符串的拷贝:
注意:
1. 目的空间一定要足够大,存放的下源字符
练习:定义两个数组src和dst,从终端接收一个字符串存入,src数组中,并将src中的字符串拷贝到dst中(不能使用strcpy)
#include
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;
}
字符串的拼接,在第一个字符串末尾拼接上第二个字符串
注意:
1. 第一个字符串要空间足够大
练习: 定义两个数组str1和str2,从终端接收两个字符串存入str1和str2中,并将str2字符串拼接到str1的末尾(不能使用strcat)
#include
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;
}
字符串的比较:
如果两个字符串相同,结果为0;
如果第一个字符串 > 第二个字符串,结果为 > 0 的值
如果第一个字符串 < 第二个字符串,结果为 < 0 的值
两个字符串比较,从左到右每个字符进行比较,不相同的字符,谁的ASCII码值大,字符串就大
练习:定义两个数组str1和str2,从终端接收两个字符串存入,str1和str2中,比较str1和str2的大小(不能使用strcmp)
#include
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;
}
数据类型 数组名[行数][列数];
char str[5][32];
1. 连续性 2. 有序性;
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};
特性:1. 避免重复性代码
2. 程序代码模块化
函数类型 函数名(数据类型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
函数名(实际参数1, 实际参数2, ...);
注意:
1.实参个数必须与形参个数一一对应
2.实参可以是常量、变量、或者表达式
3.函数调用时会发生实参向形参空间的拷贝,实参将值拷贝给形参(一一对应),实参类型与形参类型不一致时,将实参类型默认转换为形参类型
练习: 封装4个函数 Add Sub Mul Div ,从终端接收2个数,调用4个函数打印出四则运算的结果。
#include
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;
}
定义:定义需要为变量开辟空间
声明:该变量是存在的,不需要开辟空间
如果被调函数的定义在主调函数的下方,需要对被调函数声明一下
封装三个函数:
函数1,传入年份,获得该年是闰年还是平年,闰年返回1,平年返回0
函数2,传入年 月 日信息,打印出这一天是该年的第几天
函数3,传入年 月 日信息,打印该年剩余多少天
(提示:函数2嵌套函数1,函数3嵌套函数2)
#include
#include
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;
}