C语言---字符串

C语言—字符串

//字符数组
char word[]={'H','e','l','l','o','!'};
//字符串
char word[]={'H','e','l','l','o','!','\0'};
  1. 以0(整数0)结尾的一传数组。(0或者’/0’是一样的(数值:48或者0x30),但是和’0’是不同的)
  2. 0标志字符串的结束,但是它不是字符串的一部分
  3. 计算字符串的长度的时候也不包含0
  4. 字符串以数组的形式存在,以数组或者指针的形式访问(更多的时候使用指针
  5. 需要使用到的头文件:string.h里边的函数来处理字符串

字符串变量

//定义

char *str="Hello";
char world[]="Hello";
char world[10]="Hello";		//\0编译器会自动生成
    

"Hello"会被编译器变成一个字符数组放在某处,数组的长度为6(结尾有’\0’)

注意:

  1. 不能用运算符对字符串做运算
  2. 通过数组的方式可以遍历字符串
  3. 指针形式定义的字符串位于代码段,只能读,不能写
  4. 使用数组的方式定义字符串,可以读写
char *str="Hello";		//只能读,不能写
char world[]="Hello";	//能读能写

总结:

1.构造一个字符串:用数组的形式:

2.处理一个字符串:用指针的形式

3.char*不一定是个字符串,只有它指向带0的数组才是字符串

字符串的输入输出

char string[8];
scanf("%s",string);
printf("%s",string);

scanf读入结束标志**:空格,tab,回车**

注意:scanf是不安全的,因为不知道要读入内容的长度

解决问题:限制输入的个数

scanf("%7s",string);

字符串的常见错误:

​ 1.以为char*就是字符串类型,定义了一个字符串类型的变量就直接使用

//错误使用
char *string;
scanf("%s",string);

空字符串

char buffer[100]="";//空字符串,buffer[0]='\0'
char buffer[]=""//数组的长度为1!放不下任何字符串

字符串数组

char **a;:表示a是一个指针,指向另一个指针,那个指针指向一个字符串

char a[][10]:表示有一大片空间,但是这个数组的每个单元最多放10个字符(包括’\0’)

char *a[]:表示数组的每一个单元都是指针,指向一个地址空间,每一个单元可以存放无限制的字符串。

单字符的输入输出

putchar函数(输出)

int putchar(int c)

  1. 出写一个字符
  2. 返回写了几个字符,EOF(-1)表示写失败

getchar函数(输入)

int getchar(void)

  1. 读入一个字符
  2. 返回类型为int是为了能返回EOF(-1)

字符串函数

string.h的头文件中

strlen函数

原型:size_t strlen(const char *s)

作用:返回s字符串的长度(不包括结尾的0)

const的作用:保证不修改传进来的函数

//自己封装计算字符串长度的函数
int mylen(const char *s)
{
	int cnt;
	while(*s++!=0)
	{
		cnt++;
	}
	return cnt;
}
strcmp函数

原型:int strlen(const char *s1,const char *s2)

作用:会根据 ASCII 编码依次比较 s1 和 s2 的每一个字符,直到出现不到的字符,或者到达字符串末尾(比较两个字符串。返回:

0s1==s2
1s1>s2
-1s1<s2
//自己封装比较字符串的函数
int mycmp(const char *s1,const char *s2)
{
	int cnt; 
	while(1)
	{
		if(s1[cnt]!=s2[cnt])
		{
			if(s1[cnt]>s2[cnt])
				return 1;
			else return -1;
		}
		else{
			if(s1[cnt]=='\0')
				return 0;
		}
		cnt++;	 
	}
}
strcpy函数

原型char* strcpy(char *restric dst,char *restric src)

作用:把src的字符串拷贝到dst(目标在前,源在后)

​ restrict表示str和dst的地址空间不能重叠

复制一个字符串

	char *dst;	
	dst=(char*)malloc(strlen(string)+1);
	strcpy(dst,string);
//自己封装复制字符串的函数
void mycpy(char *dst,const char *str)
{
	while(*str)
	{
		*dst++=*str++;
	}
	*dst=0;
}
strcat函数

原型cahr* strcat(cahr *restrict s1,const cahr *restrict s2)

作用:把s1拷贝到s2的后面,接成一个长的字符串

返回:s1

字符串找字符

cahr* strchr(const char *s,int c)找第一次出现c的字符

cahr* strrchr(const char *s,int c)从右边找第一次出现c的字符

返回值:一个指针,指针的地址为找到字符的地址。如果没有找到返回NULL

如何找第二个字符?

char *string="Hello"; 
strchr(string,'l');			//寻找第一次出现的'l'
strchr(strchr(string,'l'))	//寻找第二次出现的'l'

字符串找字符串

char* strstr(const char *s1,const cahr *s2) 寻找过程中区分大小写

char* strasestr(const char *s1,const cahr *s2) 寻找过程中不区分大小写

安全问题

strcpystrcat都有可能出现安全问题:目的的地址空间不足。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值