C语言第18天,字符串处理函数,结构
一、字符串处理函数
与printf不同,这些函数不在之前熟悉的头文件stdio.h中。而是在字符串专用的头文件string.h中。
1.获取字符串长度strlen
strlen函数可以获取字符数组中的字符串长度。它从第一个字符开始计数,直到遇到'\0'为止,并返回累计的长度。
size_t strlen(constchar*str);
输入:一个指向字符串首地址的指针。
输出:size_t类型的整型,用于表示字符串长度。
使用const有两重意义:
1.保证函数内部不会修改指针所指向的字符。2.提示使用者,传给该函数的字符串不会被修改。
size_t并不是一个新的关键词,它是已有整型变量的别名。它有可能是unsigned int别名。也有可能是unsigned long或unsigned longlong的别名。取决于编译器怎样实现。
同时,sizeof关键词返回的结果也是size_t类型的
#include<stdio.h>
#include<string.h>
int main()
{char str[20]="Hello";
size_t size=sizeof(str);
printf("sizeof=%d\n",size);
size_t len=strlen(str);
printf("len=%d\n",len);
return 0;}
结果为sizeof=20
len=5
2.字符串拼接函数strcat
strcat函数原型如下:char*strcat(char*destination, const char*source);
输入:char*destination拼接目标字符串首地址
constchar*source拼接源目标首地址
输出:
char*destination拼接完成的目标字符串首地址
#include<stdio.h>
#include<string.h>
int main()
{char dest[9]="I Love";
char src[4]="You";
strcat(dest,src);//将后面的字符串拼接到前面
printf("%s\n",src);
printf("%s\n",dest);
return 0;}
结果为:You
I Love You
格外注意目标字符串后必须还有足够空间。如果目标字符串所在的数组仅有8个元素,这样拼接后,多出来的字符将造成数组越界。
dest[9]字符数组有9个元素,而拼接后ILoveYou\0也有9个字符。所以,这样是没问题的。
3.字符串复制函数strcpy
字符串复制函数strcpy,可以将源字符串的内容,复制到目标字符数组当中。
例如,源字符串为You,目标字符串为ILove\0。字符串复制函数会将从首元素开始覆盖目标字符串。使得目标字符串变为You\0。
#include<stdio.h>
#include<string.h>
int main()
{char dest[9]="ILove";
char src[4]="You";
strcpy(dest,src);
printf("%s\n",src);
printf("%s\n",dest);
return 0;}
结果为You
You
如同字符串拼接函数一样,字符串复制函数也需要目标字符串所在的数组拥有足够空间,才能正确完成复制。
4.字符串比较函数strcmp
字符串比较函数strcmp,用于比较两个字符串,如果两个字符串一致,则返回0。
#include<stdio.h>
#include<string.h>
int main()
{const char*str1="abcedfg";
constchar*str2="abcedfgh";
constchar*str3="abcedf";
//自己比自己,相等
int ret=strcmp(str1,str1);
printf("%d\n",ret);
//str1与str2比较,小比大
ret=strcmp(str1,str2);
printf("%d\n",ret);
//str1与str3比较,大比小
ret=strcmp(str1,str3);
printf("%d\n",ret);
return 0;}
结果为0
-1
1
二、结构
例题:人员信息管理系统
每一个人员信息由下面4个部分组成。1.姓名 2.性别 3.身高 4.体重,其中,1代表男生,2代表女生。
#include<stdio.h>
#include<stdlib.h>
int main()
{//使用数组存储人员信息
//姓名数组,每个名字最多20个字节,最多10个名字。
char name[10][20];
int gender[10];
double height[10];
double weight[10];
//人员数量
int numOfPerson=0;
while(1)//类似于首页,进行交互
{
system("cls");//清除之前显示的字符
//录入信息
printf("1.input person information\n");
//查看信息
printf("2.displaypersoninformation\n");
//退出
printf("3.exit\n");
int input;
scanf("%d",&input);
system("cls");//清除之前显示的字符
if(input==1)
{//录入信息
printf("input name gender height weight:\n");//提示输入信息
scanf("%s%d%lf%lf",name[numOfPerson],&gender[numOfPerson],&height[numOfPerson] numOfPerson++;}//依次输入信息
else if(input==2)
{//查看信息
printf("display personal information\n");
printf("name gender height weight:\n");
for(int i=0; i<numOfPerson; i++)
{printf("%s %d %.2f %.2f\n",name[i],gender[i],height[i],weight[i]);}//利用循环依次打印信息
system("pause");}//程序暂停
else
{break;}
}
return 0;}
system是头文件stdlib.h中的一个函数,它的参数是一串字符串。这个字符串是命令行中的一串命令。
"cls"命令,用于清除控制台中之前显示过的字符。"pause"命令,用于暂停程序执行,按任意键后继续执行。
1.聚合数据,关键词struct。
我们将这4项信息,聚合到一个实体当中。
struct{char name[20];
int gender;
double height;
double weight;}
现在,我们有了一个新数据类型。这种由不同类型聚合而成的数据被称之为结构。
我们可以使用这个数据类型,定义一个10个元素的数组。
struct{...} arr[10];//相当于int arr[10];
我们可以使用成员运算符 . ,结合上字段名来访问聚合物种的每一项成员。
arr[0].name;
arr[0].gender;
arr[0].height;
arr[0].weight;
假设我们现在正要输入第1个成员信息,那么代码将修改为下面这样。
//录入第一个成员信息
scanf("%s %d %lf %lf", arr[0].name, &arr[0].gender, &arr[0].height, &arr[0].weight);
代码可以改为
#include<stdio.h>
#include<stdlib.h>
int main()
{//1.数组定义
struct{char name[20];
int gender;
double height;
double weight;}arr[10];
//人员数量
int numOfPerson=0;
while(1)//类似于首页,进行交互
{
system("cls");//清除之前显示的字符
//录入信息
printf("1.input person information\n");
//查看信息
printf("2.displaypersoninformation\n");
//退出
printf("3.exit\n");
int input;
scanf("%d",&input);
system("cls");//清除之前显示的字符
if(input==1)
{//录入信息
printf("input name gender height weight:\n");//提示输入信息
scanf("%s%d%lf%lf",arr[numOfPerson].name,&arr[numOfPerson].gender,&arr[numOfPenumOfPerson++;//2.录入数据
else if(input==2)
{//查看信息
printf("display personal information\n");
printf("name gender height weight:\n");
for(int i=0; i<numOfPerson; i++)
{printf("%s %d %.2f %.2f\n",arr[i].name, arr[i].gender, arr[i].height, arr[i].weight;}//3.显示数据
system("pause");}//程序暂停
else
{break;}
}
return 0;}
之前,需要我们手动组合4个数组中的元素,组成一个人员的信息。
名字数组[n]+性别数组[n]+身高数组[n]+体重数组[n]=人员n的信息
现在,我们使用一个数组的元素,并通过.字段的方式就可以访问到各个信息了。
数组[n].name+数组[n].gender+数组[n].height+数组[n].weight=人员n的信息

2.结构别名
我们想定义多个人员信息结构变量。
struct{char name[20];
int gender;
double height;
double weight;}timmy;//timmy是一个成员,但我们如果每一个人都写一遍这个结构,会很冗长
所以我们在第一次声明结构变量时,在struct与{之间可以填写一个结构别名。若以后再次需要使用这种结构,仅需要使用struct加别名即可声明这种结构的变量。
struct person
{char name[20];
int gender;
double height;
double weight;};
struct person timmy;
struct person david;
struct person jane;
3.初始化结构
struct person{char name[20];
int gender;
double height;
double weight;};
struct person timmy={"timmy",1,170.00,60.00};
printf("%s\n",timmy.name);
printf("%d\n",timmy.gender);
printf("%.2f\n",timmy.height);
printf("%.2f\n",timmy.weight);
结果为timmy
1
170.00
60.00初始化成功
结构变量初始化的形式和数组初始化的形式类似。在声明时,其后跟等号与初始化列表。结构的初始化列表的写法需要注意如下4点:
1.初始化列表由花括号包括。
2.花括号内为结构成员需要被初始化的值。
3.初始化值按照结构成员声明时的顺序依次排列
4.每个初始化值之间由逗号分隔。
4.嵌套结构
一个结构可以作为另一个结构的成员。
例如,我们声明一个结构,用于存储通讯方式。通讯方式由电话号码,邮箱组成
struct contact{char phone[20];
char email[20];};
struct person{char name[20];
int gender;
double height;
double weight;
struct contact c;};
如何初始化被嵌套的结构呢?
在人员信息初始化列表的第对应位置处,填写初始化列表
struct person timmy={"timmy",1,170.00,60.00,{"130123456678","timmy@xxx.com"}};
使用.加字段名可以访问到通讯方式结构。如果还想访问其内部的成员,再次使用.加字段名即可。
printf("%s\n",timmy.c.phone);
5.指向结构的指针
struct person timmy={"timmy",1,170.00,60.00};
structperson*pTimmy=&timmy;
怎样使用指向结构的指针呢?由于取地址&与取值*它们具有可逆关系,我们可以把指针先转为结构再使用。
printf("%s\n",(*pTimmy).name);
printf("%d\n",(*pTimmy).gender);
printf("%.2f\n",(*pTimmy).height);
printf("%.2f\n",(*pTimmy).weight);
另外,C语言中提供了更加方便的写法,成员间接运算符->。
(*pTimmy).name等价于pTimmy->name。
printf("%s\n",pTimmy->name);
printf("%d\n",pTimmy->gender);
printf("%.2f\n",pTimmy->height);
printf("%.2f\n",pTimmy->weight);
6.结构在函数中传递
有了结构指针我们就可以在不同的函数中修改结构中的数值,
当然使用函数定义结构,在不同函数中引用定义的函数进行修改也可以
                    
                
                
            
        
浙公网安备 33010602011771号