c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))

这篇具有很好参考价值的文章主要介绍了c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

上篇文章介绍了一些常用的字符串函数,大家可以跳转过去浏览一下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(上))_总之就是非常唔姆的博客-CSDN博客

今天接着来介绍一些: 


目录

一.字符串查找

1.strstr()

1.1示例

1.2注意事项:

1.3模拟实现

 2.strtok()

 2.1示例

2.2注意事项

 二.错误信息报告

1.strerror()

 1.1示例

1.2注意事项:

 三.内存操作函数

1.memcpy()

1.1示例

1.2注意事项

2.memmove()

 2.1示例

 2.2注意事项:

3.memset()

 3.1示例

 3.2注意事项:

 4.memcmp()

4.1示例

4.2注意事项:


一.字符串查找

1.strstr()

strstr是一个C标准库函数,用于在一个字符串中查找另一个字符串的第一次出现的位置。它的原型如下:

char *strstr(const char *haystack, const char *needle);

strstr函数接受两个参数,haystack是要搜索的字符串,needle是要查找的子字符串。函数返回一个指向第一次出现的子字符串的指针,如果找不到子字符串,则返回NULL

下面是strstr函数的工作原理:

  1. 首先,strstr函数会在haystack字符串中搜索needle字符串的第一个字符

  2. 一旦找到了与needle的第一个字符匹配的字符,strstr函数会继续比较haystack中的后续字符和needle中的字符,直到找到一个不匹配的字符或者needle中的所有字符都匹配

  3. 如果找到了完全匹配的子字符串,strstr函数会返回指向该子字符串的指针

  4. 如果在haystack中找不到子字符串,或者needle是一个空字符串,则strstr函数会返回NULL

1.1示例

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cd";
	printf("%s", strstr(arr1, arr2));
	return 0;
}

 如果找到了完全匹配的子字符串,strstr函数会返回指向该子字符串的指针,结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言

1.2注意事项:

strstr函数是区分大小写的,如果要进行大小写不敏感的字符串比较,可以使用其他函数 

1.3模拟实现

char* my_strstr(const char* a1, const char* a2)
{
	char* cp = a1;
	char* str1 = a1;
	char* str2;

	while (*cp)
	{
		str1 = cp;
		str2 = a2;
		while (*str1&&*str2&&*str1 == *str2)
		{
			str1++;
			str2++;
		}
		if (*str2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "cd";
	printf("%s", my_strstr(arr1, arr2));
	return 0;
}

 2.strtok()

strtok是一个C标准库函数,用于将一个字符串分割成多个子字符串。它的原型如下:

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

其中,str是要分割的字符串delim是用作分隔符的字符串。函数返回一个指向分割后的第一个子字符串的指针,如果没有更多的子字符串,则返回NULL

strtok函数使用一个静态变量来保存当前的分割位置,因此在多次调用strtok时,需要将原始字符串传递给第一次调用,而后续的调用只需要传递NULL作为第一个参数

  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记

 2.1示例

int main()
{
	char arr[] = "123@abc%ABC";
	char a[] = "@%";
	printf("%s\n", strtok(arr, a));
	/*printf("%s\n", strtok(NULL, a));*/
	return 0;
}

 结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言

 

int main()
{
	char arr[] = "123@abc%ABC";
	char a[] = "@%";
	printf("%s\n", strtok(arr, a));
	printf("%s\n", strtok(NULL, a));
	printf("%s\n", strtok(NULL, a));
	return 0;
}

 结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言

 充分利用性质可以写出这样的代码:

int main()
{
	char arr[] = "123@abc%ABC";
	char a[] = "@%";
	/*printf("%s\n", strtok(arr, a));
	printf("%s\n", strtok(NULL, a));
	printf("%s\n", strtok(NULL, a));*/

	for (char* ret = strtok(arr, a); ret != NULL;ret= strtok(NULL, a))
	{
		printf("%s\n", ret);
	}
	return 0;
}

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言

2.2注意事项

需要注意的是,strtok函数会修改原始字符串,将分隔符替换为NULL字符。如果需要保留原始字符串,可以使用副本进行分割操作 


 二.错误信息报告

1.strerror()

strerror是一个C标准库函数,用于将错误码转换为对应的错误信息字符串。它的原型如下:

char * strerror( int errnum );

其中,errnum是错误码。函数返回一个指向错误信息字符串的指针

  • errnum是一个整数类型的错误码,通常用于表示函数调用或操作的结果状态
  • errno是一个全局变量,用于存储最近一次发生的错误码。当函数调用或操作失败时,它们通常会设置errno为一个非零的错误码,以指示错误的类型

 1.1示例

输出1~10分别代表的错误信息:

int main()
{
	for (int i = 1; i <= 10; i++)
	{
		printf("%s\n", strerror(i));
	}
	return 0;
}

结果如下:c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言
 

1.2注意事项:

strerror函数返回的指针指向的是一个静态分配的字符串,因此在多线程环境下不是线程安全的


 三.内存操作函数

1.memcpy()

memcpy是一个标准C库函数,用于将一段内存区域的数据复制到另一段内存区域。它的函数原型如下:

void *memcpy(void *dest, const void *src, size_t n);

其中,dest是目标内存区域的指针,src是源内存区域的指针,n是要复制的字节数。

memcpy函数将源内存区域的n个字节复制到目标内存区域中。如果源和目标区域重叠,memcpy函数的行为是未定义的。如果需要处理重叠区域的复制,可以使用memmove函数(下面介绍)

这个函数在遇到 '\0' 的时候并不会停下来 

1.1示例

int main() 
{
    char src[] = "Hello, world!";
    char dest[20];

    memcpy(dest, src, strlen(src) + 1);

    printf("source string: %s\n", src);
    printf("copied string: %s\n", dest);
    return 0;
}

结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言 

1.2注意事项

需要注意的是,memcpy函数不会自动添加字符串结束符\0,因此在复制字符串时需要将\0一起复制。在上面的示例中,strlen(src) + 1计算了源字符串的长度,并将其加1,以便复制\0 

2.memmove()

memmove是一个标准C库函数,用于将一段内存区域的数据复制到另一段内存区域,与memcpy函数类似。但是,memmove函数可以处理源和目标区域重叠的情况,而memcpy函数则不能

memmove函数的函数原型如下:

void *memmove(void *dest, const void *src, size_t n);

其中,dest是目标内存区域的指针,src是源内存区域的指针,n是要复制的字节数。

memmove函数将源内存区域的前n个字节复制到目标内存区域中。如果源和目标区域重叠,memmove函数会确保复制的结果是正确的,即使源和目标区域重叠。因此,memmove函数比memcpy函数更安全,但通常也更慢

 2.1示例

int main() 
{
    char str[] = "123456";
    memmove(str,str+3,3);
    printf("%s\n", str);
    return 0;
}

 结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言

 2.2注意事项:

需要注意的是,memmove函数和memcpy函数一样,不会自动添加字符串结束符\0,因此在复制字符串时需要将\0一起复制

3.memset()

memset是一个用于设置内存块内容的函数。它可以将指定的内存块中的每个字节都设置为特定的值。

memset函数的原型如下:

void *memset(void *ptr, int value, size_t num);

参数说明:

  • ptr:指向要设置的内存块的指针。
  • value:要设置的值,以整数形式提供。
  • num:要设置的字节数。

memset函数将ptr指向的内存块的num个字节设置为value指定的值

 3.1示例

int main() 
{
    char str[20] = { 0 };
    memset(str, 'A', 10);
    printf("%s\n", str);
    return 0;
}

 结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言

 3.2注意事项:

需要注意的是,memset函数是按字节进行设置的,因此对于非字符类型的数组,需要将value参数转换为相应的字节表示

 4.memcmp()

memcmp函数用于比较两个内存区域的内容是否相同,其原型如下:

int memcmp(const void *ptr1, const void *ptr2, size_t num);

参数说明:

  • ptr1:指向第一个内存区域的指针。
  • ptr2:指向第二个内存区域的指针。
  • num:要比较的字节数。

memcmp函数将ptr1指向的内存区域和ptr2指向的内存区域的前num个字节进行比较,返回值如下:

  • 如果两个内存区域相同,返回0。
  • 如果第一个内存区域小于第二个内存区域,返回负整数。
  • 如果第一个内存区域大于第二个内存区域,返回正整数

4.1示例

int main() 
{
    char str1[20] = "Hello, world!";
    char str2[20] = "Hello, world!";
    int result1 = memcmp(str1, str2, strlen(str1));
   
    printf("result = %d\n", result1);
    return 0;
}

结果如下:

c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下)),c语言,开发语言
 

4.2注意事项:

memcmp函数比较的是字节,因此对于非字符类型的数组,比较的结果可能与预期不同 

 


好了各位,这次的内容就先整理到这里吧!下次按照学习计划就打了结构体的部分知识内容啦! 文章来源地址https://www.toymoban.com/news/detail-727689.html

到了这里,关于c语言进阶部分详解(详细解析字符串常用函数,并进行模拟实现(下))的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • R语言 | 进阶字符串的处理

    目录 一、语句的分割  二、修改字符串的大小写  三、unique()函数的使用  四、字符串的连接 4.1 使用paste()函数常见的失败案例1 4.2 使用paste()函数常见的失败案例2 4.3 字符串的成功连接与collapse参数 4.4 再谈paste()函数 4.5 扑克牌向量有趣的应用 五、字符串数据的顺序 六、查找

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

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

    2024年02月12日
    浏览(43)
  • 【C语言进阶(三)】字符串操作函数

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

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

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

    2024年02月16日
    浏览(35)
  • 【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容

           小编在写这篇博客时,经过了九一八,回想起了祖国曾经的伤疤, 勿忘国耻,振兴中华!加油,逐梦少年! 💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库

    2024年02月07日
    浏览(28)
  • 深入解析C语言中的字符串和字符串处理函数

    标题:详解C语言中的字符串和字符串处理函数 目录: 1.引言 2.什么是C语言中的字符串 3.字符串的表示方式 4.C语言中的字符串处理函数 5.例子:使用字符串处理函数的示例代码 6.总结 在C语言中,字符串是一种常见的数据类型,用于存储一串字符。本篇博客将详细介绍C语言中

    2024年02月15日
    浏览(35)
  • JavaScript字符串字面量详细解析与代码实例

    JavaScript字符串字面量是一种表示字符串值的语法结构,通常用双引号或单引号括起来。 另外,如果需要在字符串中包含双引号或单引号,可以使用转义字符 来实现。 除了双引号和单引号,JavaScript字符串字面量还支持一些特殊字符的转义,如下表所示: 转义字符 描述 \\\\

    2024年02月05日
    浏览(32)
  • 使用v-html进行渲染如何使标签按照字符串显示,特殊样式标签(自己添加的部分)按照标签解析

    使用v-html进行渲染如何使标签按照字符串显示,特殊样式标签(自己添加的部分)按照标签解析 需求:是内容里如果含有含有www.baidu.com这种链接高亮显示 解决办法: 首先拿到需要回显的内容content对内容进行转义escapeHTML,之后再去判断是否是链接进行高亮添加 代码如下

    2024年02月16日
    浏览(31)
  • 掌握字符与字符串:C语言中的神奇函数解析(一)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 我们在学习C语言的过程中,除了使用最多的头文件stdio.h,还会使用其他头文件,利用其中的库函数帮助我们简化代码的过程,比如像math.h,string.h等头文

    2024年03月09日
    浏览(54)
  • 掌握字符与字符串:C语言中的神奇函数解析(三)

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 除了字符函数和字符串函数,string.h中还有一类 内存操作函数 ,如memset(),memcmp()等函数,他们在功能和某些字符串函数很像,但作用范围更广,除了作用

    2024年03月09日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包