字符串和字符串函数

字符串和字符串函数

重点
1 求字符串的长度
strlen
2 长度不受限制的字符串函数
strcpy
strcat
strcmp
3 长度受限制的字符串函数介绍
strncpy
strncat
strncmp
4 字符串查找
strstr
strtok

前言

C语言中对字符和字符串的处理很频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。

函数介绍
strlen
size_t strlen (const char* str)

#include<stdio.h>
int main()
{
	int len;
	char str[] = "hello world"; //定义一个字符数组
	len = strlen(str);//计算字符串的长度
	printf("字符串的长度为:%d\n", len);
	return 0;
}

在这里插入图片描述

模拟实现

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
	assert(str != NULL);//断言str不为空指针
	int count = 0;//计数器
	while (*str != '\0')
	{
		count++;//每识别一个不为'\0'的字符计数器加一
		str++; //指向下一个字符的地址
	}
	return count;
}
int main()
{
	int len;
	char str[] = "hello world";
	len = my_strlen(str);
	printf("字符串的长度为:%d\n", len);
	return 0;
}

注意
1 字符串已经‘\0‘作为结尾标志,strlen函数返回的是在字符串中’\0‘前面出现的字符个数(不包括’\0’)。
2 参数指向的字符串必须要以’\0‘结束。
3 注意函数的返回值为size_t,是无符号的。

strcpy
char* strcpy(cahr* destination,const cahr* source)
作用:把source所指向的字符串复制到destination.

#include<stdio.h>
int main()
{
	char dest[10] ;
	char src[6] = "hello";//定义一个字符数组
	strcpy(dest, src);    //用strcpy函数将src中的字符拷贝给dest
	printf("%s\n", dest);
	return 0;
}

在这里插入图片描述
模拟实现

#include<stdio.h>
#include<assert.h>
void my_strcpy(char *dest, char *src)//定义void型的函数没有返回值
{
	if (dest == NULL || src == NULL)  //定义两个字符串不为空
	{
		return;
	}
	while (*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;       //判断src字符串是否结束,将src中的字符逐一拷贝给dest

	}
	*dest = '\0';
}
int main()
{
	char src[6] = "hello";
	char dest[10];
	my_strcpy(dest, src);
	printf("%s\n", dest);
	return 0;
}

注意
1.源字符串必须以’\0’结束。
2.会将源字符串中的’\0’拷贝到目标空间
3.目标空间必须足够大,以确保能存放源字符串
4.目标空间必须可变

strcat
cahr* strcat(cahr* destination,const char* source);
作用:将源字符串拼接到目标字符串

#include<stdio.h>
int main()
{
	char dest[16] = "Hello ";
	char src[6] = "World";
	strcat(dest, src);
	printf("%s\n", dest);
	return 0;
}

在这里插入图片描述

模拟实现

char *my_strcat(char *dest, const char *src)
{
	char *ret = dest;//定义指针变量存储目标字符的地址
	assert(dest != NULL); //断言dest与src不为空
	assert(src != NULL);
	while (*dest!='\0')   
	{
		dest++;      //找\0
	}
	while ((*dest = *src))
	{
		dest++;
		src++;    //数据拷贝
	}
	return ret;	
}

注意
1.源字符串必须以’\0’结束
2.会将源字符串中的’\0’拷贝到目标空间中
3.目标空间必须可修改

strcmp
int strcmp(const char *str1,const char *str2);
功能:用来比较两个字符串

#include<string.h>
int main()
{
	char *str1 = "aBc";
	char *str2 = "Abc";
	char *str3 = "abc";
	printf("strcmp(str1,str2):%d\n",strcmp(str1, str2));
	printf("strcmp(str2,str3):%d\n",strcmp(str2, str3));
	return 0;
}

在这里插入图片描述

模拟实现

int my_strcmp(char const *str1, char const *str2)
{
	assert(str1 != NULL&&str2 != NULL);
	int ret = 0;
	while (!(ret = (*str1 - *str2)) && *str1)//如果两者相等且不为'\0'
	{
		str1++;
		str2++;
	}
	if (ret < 0)
		ret = -1;
	else if (ret>0)
		ret = 1;
	return ret;
}

注意
1.strcmp字符串比较,比较字符串str1和str2是否相同。如果相同则返回0;
如果不同,在不同的字符处如果str1的字符大于str2的字符,则返回1,否则返回-1
2.从两个字符串的第一个字符开始比较,比较到出现不一样的或者一个字符串结束或者num个字符比较完为止。

strncpy
char *strncpy(char *destination,const char *source,size_t num);
功能:拷贝num个字符从源字符串到目标空间。

#include<stdio.h>
int main()
{
	char str1[20] = { 0 };//初始化str1
	char str2[20] = "To be or not to be";
	strncpy(str1, str2, 8);//将str2中的前八个字符拷贝给str1
	printf("%s\n", str1);
	return 0;
}

在这里插入图片描述
注意
1.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,直到num个。
2.目标字符串必须足够大。

strncat
char *strncat(cahr *destination,const char *source,size_t num);
说明:将源字符串中num个字符拼接到源字符串的后面。

#include<stdio.h>
int main()
{
	char str1[40] = "To be";
	char str2[20] = "or not to be 1234";
	strncat(str1, str2, 12);
	printf("%s\n", str1);
	return 0;
}

在这里插入图片描述
注意
1.目标字符串要足够大
2.如果n大于字符串src的长度,那么仅将src指向的字符串内容追加到dest的尾部。

strncmp
int strncmp(const char *str1,const char *str2,sze_t num);
说明:比较str1与str2的大小,可以指定比较字符的数目。

#include<stdio.h>
#include<string.h>
int main()
{
	int ret;
	char str1[10] = "ABCD";
	char str2[10] = "Abcd";
	ret = strncmp(str1, str2, 1);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main()
{
	int ret;
	char str1[10] = "ABCD";
	char str2[10] = "Abcd";
	ret = strncmp(str1, str2, 2);
	printf("%d\n", ret);
	return 0;
}

在这里插入图片描述
strstr
char *strstr(const char *,const char *);
说明:判断str2是否是str1的字串,如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL

#include<stdio.h>
int main()
{
	char *ret;
	const char str1[40] = "To be or not to be";
	const char str2[10] = "or";
	ret = strstr(str1, str2);
	printf("%s\n", ret);
	return 0;
}

在这里插入图片描述
注意
在使用或者处理strstr(str1,str2)返回值之前,切记不要对str1字符串进行更改,若要更改,应该等使用完返回值后再更改!!

strtok
char *strtok(char *str,const char *sep);
说明:分解字符串为一组字符串,str为要分解的字符串,sep为分隔符字符串,当在参数str的字符串中发现到字符串sep 时,则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数str 字符串,往后的调用则将参数str 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。

#include<stdio.h>
int main()
{
	char *ret;
	char str1[40] = "To 1 be 2 or 3 not 4 to 5 be";
	char sep[10]= "1 2 3 4 5";
	printf("%s\n", strtok(str1,sep ));
	while ((ret = strtok(NULL, sep)))
		printf("%s\n", ret);
	return;
}

在这里插入图片描述
注意
1.sep参数是字符串,定义了用作分隔符的字符集合。
2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中的一个或多个分隔符分割的标记。
3.strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。
4.strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存它在字符串中的位置。
5.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6.如果字符串中不存在更多的标记,则返回NULL指针。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值