c语言的字符串函数详解

b170e30a5d104d0883288c1bb779c361.gif

文章目录

  • 前言
  • 一、strlen求字符串长度的函数
  • 二、字符串拷贝函数strcpy
  • 链接或追加字符串函数strcat
  • 字符串比较函数strcmp
  • 长度受限制字符函数
  • 找字符串2在字符串1中第一次出现的位置函数strstr
  • 字符串切割函数strtok(可以切割分隔符)
  • 翻译错误码所对应的错误信息strerror

 


前言

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列的库函数,接下来我们就学习⼀下这些函数。


一、strlen求字符串长度的函数

size_t strlen ( const char * str )

这个函数是我们之前用的最多的函数了,所以相对之下也比较熟悉,这里也就简单地概括一下,讲下注意点,这个函数他'/0'零作为结束标志注意和sizeof的区别。他的模拟实现有三种方法http://t.csdnimg.cn/PXwTV,以前写过,就不多说了。

 

二.字符串拷贝函数strcpy

char* strcpy(char * destination, const char * source );

2.1使用

destination这个是目的,source这个是源头,字符拷贝的意思就是把源头的数据拷贝到目的中去。使用之前引用头文件<string.h>。

int main()
{
	char name[20] = { 0 };
	strcpy(name,"zhangsan");
	printf("%s",name);
    return 0;
}

打印的结果就是zhangsa,但是要注意,目地空间必须是可以改变的改变的,不可以为常量字符串。注意:1.它以'/0'结束。2.它会把'/0'也拷入目地空间。3.目的空间必须足够大,不然会越界。

2.2模拟实现

my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	while (src)
	{
		*dest++ = *src++;
	}
	*dest = *src;//拷贝/0
	return ret;
}

为这个代码,他最后是要返回目的的数组,所以在开始前,我得先把他的地址拷贝起来

三.链接或追加字符串函数strcat

char* strcat(char * destination, const char * source );

3.1使用

int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

打印结构就是hello world,用法根之前同理,目标空间必须足够大,而且是要可修改的,目标字符串中也得有 \0,否则没办法知道追加从哪里开始。

3.2模拟实现

my_strcat(char* dest, const char* src)
{
	//assert(dest && src);
	//找到dest的/0
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	//拷贝字符
	while (*src)
	{
		*dest++ = *src++;
	}
	*dest = *src;//拷贝/0
	return ret;

}

3.3字符串自己给自己追加,如何?

先说结论是不能自己给自己追加的

因为自己会把/0覆盖,导致没有/0会陷入一种死循环

9d6b9531ee514c63b35c5d7562088b3a.png

四.字符串比较函数strcmp

char* strcmpchar * destination, const char * source );

4.1使用

比较字符串函数注意比较的,不是长度比的是asc码值

int main()
{
	char arr1[20] = "abcd";
	char arr2[20] = "cdf";
    int a=strcmp(arr1, arr2);
	printf("%d",a);
	return 0;
}

打印结果为-1,所以说如果arr1比arr2小就会返回-1,等于就会返回0,大于就会返回1。

431cd620217f475f8f296b36ea60fca9.png

4.2模拟实现

int my_strcmp(char* str1, const char* str2)
{
	//assert(str1 && str2);
	while (*str1 == *str2)
	{
		//相等
		if (*str1=='\0' || *str2=='\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return (*str1 - *str2);

}

五.长度受限制字符函数

以上就是长度不受限制的函数,长度受限制的函数要更加安全,在它们的后面添加数字n就可以自己去定义,strncpy,strncat,strncmp

( char * destination, const char * source, size_t num );

举一个例子:

ceec4d6dbc514a59a086190b3160123b.png

六.找字符串2在字符串1中第一次出现的位置函数strstr

char * strstr ( const char * str1, const char * str2)

6.1使用

int main()
{
	char str[] = "This is a simple string";
	char* pch = strstr(str, "simple");
	if (pch == NULL)
	{
		printf("不存在");
	}
	else
	printf("%s\n", pch);
	return 0;
}

打印结果为simple string,说明如果找到了的话它就会返回一个地址

6.2模拟实现

他的模拟实现是比较复杂的,我们要分两种情况去考虑

情况1(一次就匹配就找到了)

0b141b32d3a740b0874f120c34ba056a.png

情况2(多次匹配才可以找到)

1613fd08f251405797153f36a5de6064.png

 

char* my_strstr(const char* str1, const char* str2)
{
	//定义3个变量,s1,s2用来比较,cur用来解决第2种情况
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;
	//cur不为空就一直走
	while (cur)
	{
		s1 = str1;
		s2 = str2;
		//到了\0就停,不相等也停
		while(*s1!='\0' && *s2!='\0' && *s1==*s2)
		{
			s1++;
			s2++;
		}
		//如果是s2到0了,说明找到了
		if (*s2 == '\0')
		{
			return cur;
		}
		//可能存在第2找情况
		cur++;

	}
	//说明没有找到
	return NULL;
}

 

七.字符串切割函数strtok(可以切割分隔符)

char * strtok ( char * str, const char * sep);

这个函数的使用比较难,所以我们这里之讲解它的使用。

使用

注意:strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针,strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。strtok函数的第一个参数为NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

所以说只用一个是无法找完所以的,要配合循环语句一起使用

int main()
{
	char arr[] = "192.168.6.111";
	char* sep = ".";
	char* str = NULL;
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s\n", str);
	}
	return 0;
}

八.翻译错误码所对应的错误信息strerror

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来

1.No error
2.Operation not permitted
3.No such file or directory
4.No such process
5.Interrupted function call
6.Input / output error
7.No such device or address
8.Arg list too long
9.Exec format error
10.Bad file descriptor
11.No child processes

常见的错误信息

7f91ecfe96af4bdeaaaae568982f39d7.png

 

  • 52
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaNzikinh篮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值