【c语言:常用字符串函数与内存函数的使用与实现】

这篇具有很好参考价值的文章主要介绍了【c语言:常用字符串函数与内存函数的使用与实现】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

简介:本篇文章是对C语言中常用的字符串函数和内存函数的学习以及模拟实现
文档内容来自:https://legacy.cplusplus.com/

1. strlen函数

1.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 字符串以 ‘\0’ 作为结束标志,
  • strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 '\0' )。
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错
  • 使用需要包含对应的头文件<string.h>

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数
下面这个代码的执行结果是什么呢?

int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

strlen(str1) = 6,strlen(str2) = 3。3-6小于0,所以输出str>str2对吗?
恭喜你,掉坑里了

两个无符号数运算的结果还是无符号数,-3看成无符号数就是3,3>0所以输出str2>str1。

1.2模拟实现

  1. 定义新变量的方法
size_t my_strlen(char* str)
{
	size_t count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
  1. 指针-指针
size_t my_strlen(char* str)
{
	char* cur = str;
	while (*str)
	{
		str++;
	}
	return str-cur;
}
  1. 不定义新变量,递归法
size_t my_strlen(char* str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + my_strlen(str + 1);
	}
}

2.strcmp函数

2.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

两个字符串进行比较的时候就不能再像整数那样使用 > < = 来比较了,它实际比较的是两个字符串对应字符的ASCLL码值

  • 第⼀个字符串大于第⼆个字符串,则返回大于0的数字
  • 第⼀个字符串等于第⼆个字符串,则返回0
  • 第⼀个字符串小于第⼆个字符串,则返回小于0的数字

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

2.2模拟实现

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
	/*if (*str1 > *str2)
	{
		return 1;
	}
	else
		return -1;*/
}

3.strncmp函数

3.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

strncmp函数与strcmp函数的使用十分相似,strncmp函数只是限定了比较几个字符的大小
例如:比较前五个字符的大小
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数
当要比较的长度大于两个串本身的长度时,比较到其中一个串的末尾即可
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

3.2模拟实现

int my_strncmp(const char* str1, const char* str2, int num)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	//无字符串可比,直接返回0
	if (!num)
	{
		return 0;
	}
	//1.两字符串相等
	//2.在规定的范围内
	//3.字符串未到末尾
	while ((*str1 == *str2) && --num && *str1 != '\0')
	{
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

4.strcpy函数

4.1 使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 源字符串必须以 ‘\0’ 结束
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。
  • 函数返回目标空间的起始地址

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

4.2模拟实现

写法1:

char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while (*src)
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;
	return ret;
}

写法2:

char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

5.strcncpy

5.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 将源字符串的前 num 个字符复制到目标字符串。
  • 如果在复制 num 个字符之前找到源 C 字符串的末尾(由 null 字符表示),则 destination 将用零填充,直到总共写入 num 个字符。(不足num个,用0填充)

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

5.2模拟实现

char* my_strncpy(char* dest, const char* src, int num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	while ((*dest++ = *src++) && --num)
	{
		;
	}
	while (--num)
	{
		*dest = 0;
		dest++;
	}
	return ret;
}

6.strcat函数

6.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 源字符串必须以 ‘\0’ 结束
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。
  • 函数返回目标空间的起始地址
  • 字符串自己给自己追加,如何?(需要使用memmove)

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

6.2模拟实现

char* my_strcat(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	//找dest的\0
	while (*dest)
	{
		dest++;
	}
	//开始追加
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

7.strncat函数

7.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 将源的前 num 个字符附加到目标,外加一个终止 null 字符
  • 如果 source 中 C 字符串的长度小于 num,则仅复制 ‘\0’ 之前的内容
    【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

7.2模拟实现

char* my_strncat(char* dest, const char* src, int num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
	//找dest的\0
	while (*dest)
	{
		dest++;
	}
	//开始追加
	while (num-- && (*dest++ = *src++))
	{
		;
	}
	*dest = 0;
	return ret;
}

8.strstr函数

8.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • str1中找str2字符串,返回str2第一次出现位置的地址
  • 字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

8.2模拟实现

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* ptr1 = NULL;
	char* ptr2 = NULL;
	if (!(*str2))
	{
		return (char*)str1;
	}
	while (*str1)
	{
		ptr1 = (char*)str1;
		ptr2 = (char*)str2;
		while ((*ptr1 == *ptr2) && *ptr1 && *ptr2)
		{
			ptr1++;
			ptr2++;
		}
		if (*ptr2 == 0)
		{
			return (char*)str1;
		}
		str1++;
	}
	return NULL;
}

9.strtok函数

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • delimiters参数指向⼀个字符串,定义了用作分隔符的字符集合
  • 第⼀个参数指定⼀个字符串,它包含了0个或者多个由delimiters字符串中⼀个或者多个分隔符分割的标记。
  • strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容并且可修改。
  • strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

是不是有点难理解?
用大白话说就是:

strtok函数是以一个delimiter函数中的字符为分隔依据的函数,第一次调用该函数需要将要分隔的字符串的地址传给他,它会根据分隔依据找第一次在字符串中出现该分隔符的位置,将其用\0替代,并且返回一个指向这个分隔符的指针。下一次调用就只需要传给它空指针和分隔依据,它会从上一个分隔符位置再次开始找,直到找到分隔符。最终找到字符串结尾即可。

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

10.strerror函数

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

  • 在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0, 表⽰没有错误,
  • 当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。

strerror函数就可以将错误对应的错误信息字符串的地址返回。

打印0-10错误码对应的信息:
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数
例如:我们使用fopen函数打开本地某一个文件夹,它就会自动打印处使用该函数产生的错误。
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数
再我们以上所讲的所有字符串函数,你要相对字符串进行操作,是不是必须知道它的类型呀?可不是什么时候我们都能准确的知道的,比如一个结构体类型的数据。当我们不知道的时候,那么该如何操作呢?下面我们将进行讲解:

11.memcpy

11.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 将 num 字节的值从源指向的位置直接复制到目标指向的内存块
  • 源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本
  • 该函数不检查源中的任何终止 null 字符 - 它始终准确复制 num 个字节

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

11.2模拟实现

void* my_memcpy(void* dest, const void* src, int num)
{
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}

12.memmove函数

12.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
  • 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

12.2模拟实现

void* my_memmove(void* dest, const void* src, int num)
{
	void* ret = dest;
	//从前向后拷
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	//从后向前拷
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

13.memset函数

13.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
  • 将ptr指向的内存的第一个字节设置为指定的值

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

13.2模拟实现

void* my_memset(void* ptr, int x, int num)
{
	void* ret = ptr;
	while (num--)
	{
		*((char*)ptr + num) = x;
	}
	return ret;
}

14.memcmp函数

14.1使用

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

  • 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节,
  • 如果它们都匹配,则返回零,或者返回一个不同于零的值,如果它们不匹配,则表示哪个值更大。
  • 请注意,与 strcmp 不同,该函数在找到 null 字符后不会停止比较,

【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数

14.2模拟实现

/*
当buf1<buf2时,返回值<0
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
*/
int my_memcmp(const void* buffer1, const void* buffer2, int num)
{
	 当比较位数不为0时,且每位数据相等时,移动指针
	while (--num  && *(char*)buffer1 == *(char*)buffer2)
	{
		buffer1 = (char*)buffer1 + 1;
		buffer2 = (char*)buffer2 + 1;
	}
	return (*(char*)buffer1) - (*(char*)buffer2);
}

目前本人学习和使用到的字符串、内存函数就这些,如有错误,请批评指正!
【c语言:常用字符串函数与内存函数的使用与实现】,C_language,c语言,开发语言,字符串函数,内存函数文章来源地址https://www.toymoban.com/news/detail-766966.html

到了这里,关于【c语言:常用字符串函数与内存函数的使用与实现】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言——字符串函数和内存操作函数

    包含在string.h头文件里 功能:返回字符串中有效字符的个数,遇到‘\\0’结束,不包括结束符‘\\0’. 函数的参数为------const char* str:字符指针 返回值的类型------size_t:无符号整数(即:unsigned int) 模拟实现strlen: 方法一:计数器的方法 方法二:不能创建临时变量的计数器

    2024年02月14日
    浏览(68)
  • C语言进阶---字符串+内存函数

    重点介绍处理字符和字符串的库函数的使用和注意事项。 求字符串长度 strlen() 长度不受限制的的字符串函数 strcpy() strcat() strcmp() 长度受限制的的字符串函数 strncpy() strncat() strncmp() 字符串查找 strstr() strtok() 错误信息报告 strerror() 字符操作 内存操作函数 memcpy() memmove() memset(

    2024年02月12日
    浏览(52)
  • 进阶C语言——字符串和内存函数

    今天我们学点库函数 字符函数和字符串函数 求字符串长度函数-strlen strlen需要的头文件是string.h ,那它的作用是什么呢?? 他是来求字符串长度的,统计的是’\\0’前的字符串长度 size_t是无符号的意思 学会了strlen函数怎么使用,那我们现在模拟实现一下strlen 之前讲过三种方

    2024年02月16日
    浏览(47)
  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(58)
  • C语言之字符串,内存操作函数详解(一)

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 C语言的标准库为我们提供了丰富的字符串操作函数与内存操作函数,有我们熟悉的 strlen ,strcpy ,也有我们不熟悉的 strchr , strstr 等

    2024年02月08日
    浏览(66)
  • 【C语言】——字符串函数的使用与模拟实现(上)

      在我们学习 C语言 的过程中,对 库函数 的使用是必不可少的。其中,相信大家最熟悉的就是 s t d i o . h stdio.h s t d i o . h 中的 p r i n t print p r in t 和 s c a n f scanf sc an f 函数了吧。   但是今天,我们不讲他们(太难了,呜呜呜),今天我们来讲与字符串相关的函数,也就

    2024年04月26日
    浏览(40)
  • C语言:字符串函数的使用方法及模拟实现

    方法一:计数器方式 方法二:指针-指针 1.1 strcpy只用于字符串复制,遇到‘\\0’时停止,还会复制字符串的结束符\\\'\\0\\\'; 所以源字符串必须         以’\\0’结束,也会将源字符串的’\\0’拷贝到目标空间。 1.2 目标空间必须可变。 1.3 如果参数dest所指的内存空间不够大,可能

    2024年04月25日
    浏览(43)
  • 高阶C语言|字符函数和字符串函数--函数的模拟实现

    C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数 size_t代表strlen函数返回的是一个无符号整形,str指向的是字符串,接收字符串的地址 字符串已

    2024年02月16日
    浏览(68)
  • C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)

      strlen即为string length,顾名思义该函数是用来求字符串长度的。在介绍strlen函数之前,我们要先介绍一下\\\"\\0\\\"这个转义字符。任何一个字符串后面都会隐藏一个\\\"\\0\\\",该转义字符是字符串结束的标志,所以我们在使用strlen函数求字符串长度时,遇到\\\"\\0\\\"时停止读取,此时\\\"\\0\\\"前的

    2024年01月18日
    浏览(50)
  • 【C语言】字符函数和字符串函数的详细教学和模拟实现

    🚀write in front🚀 🔎大家好,我是gugugu。希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🆔本文由 gugugu 原创 CSDN首发🐒 如需转载还请通知⚠ 📝个人主页:gugugu—精品博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:gugugu的精品博客 ✉️

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包