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.结构在函数中传递

有了结构指针我们就可以在不同的函数中修改结构中的数值,

当然使用函数定义结构,在不同函数中引用定义的函数进行修改也可以

 
 
posted @ 2022-09-25 12:53  纯爱暴打ntr  阅读(140)  评论(0)    收藏  举报