字符串与相应函数(下)

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
字符串处置惩罚函数分类



  • 求字符串长度:strlen
  • 长度不受限制的字符串函数:strcpy,strcat,strcmp
  • 长度受限制的字符串函数:strncpy,strncat,strncmp
  • 字符串查找:strstr
  • 字符串切割:strtok
  • 错误信息陈诉:strerror
  • 字符操纵,内存操纵函数:memcpy,memmove,memset,memcmp


strstr

strstr函数是C标准库中的一个字符串处置惩罚函数,用于在一个字符串中查找子字符串的第一次出现位置。strstr函数用于在字符串中查找子字符串的第一次出现位置。假如找到,则返回指向该位置的指针;假如未找到,则返回NULL


strstr函数的特点



strstr函数的模拟实现

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<assert.h>
  5. char* my_strstr(const char* str1, const char* str2)
  6. {
  7.         assert(str1 && str2);
  8.         if (str2 == "\0")
  9.         {
  10.                 return (char*)str1;
  11.         }
  12.         const char* s1 = str1;
  13.         const char* s2 = str2;
  14.         const char* cp = str1;
  15.         while (*cp)
  16.         {
  17.                 s1 = cp;
  18.                 s2 = str2;
  19.                 while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))
  20.                 {
  21.                         s1++;
  22.                         s2++;
  23.                 }
  24.                 if (*s2 == '\0')
  25.                 {
  26.                         return (char*)cp;
  27.                 }
  28.                 cp++;
  29.         }
  30.         return NULL;
  31. }
  32. int main()
  33. {
  34.         char arr1[] = "aabbbcdef";
  35.         char arr2[] = "bbc";
  36.         char* ret = my_strstr(arr1, arr2);
  37.         if (ret == NULL)
  38.         {
  39.                 printf("找不到\n");
  40.         }
  41.         else
  42.         {
  43.                 printf("%s\n", ret);
  44.         }
  45.         return 0;
  46. }
复制代码

strstr函数的使用

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.     char str[] = "This is a simple string";
  7.     char* pch;
  8.     pch = strstr(str, "simple");
  9.     if (pch != NULL)
  10.         strncpy(pch, "sample", 6);
  11.     puts(str);
  12.     return 0;
  13. }
复制代码
strtok

strtok函数是C标准库中的一个字符串处置惩罚函数,它紧张用于将输入字符串按照指定的分隔符进行分割,并返回每个子字符串的指针。这个函数非常得当处置惩罚各种常见的文天职割使命,如路径分隔、设置文件剖析和数据文件处置惩罚


strtok函数的特点

字符串粉碎:strtok函数会修改原始字符串,将其分割后的部门用\0字符添补,因此原始字符串在分割后会失去原有的形式。


  • 线程安全:strtok函数不是线程安全的,由于它使用了静态分配的空间来存储被分割的字符串位置。这意味着在多线程环境中使用strtok函数可能会导致不可推测的举动
  • 分隔符的多样性:strtok函数支持多个分隔符,只需在delim中列出全部门隔符即可
strtok函数的使用

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <string.h>
  4. int main()
  5. {
  6.         char arr[] = "198.168.120.50";
  7.         char* p = ".";
  8.         char buf[20] = { 0 };
  9.         strcpy(buf, arr);
  10.         char* ret = NULL;
  11.         for (ret = strtok(buf, p);ret != NULL;ret = strtok(NULL, p))
  12.         {
  13.                 printf("%s\n", ret);
  14.         }
  15.         return 0;
  16. }
复制代码

strerror

strerror函数是C语言中的一个函数,用于将指定的错误码转换为对应的错误信息字符串。


strerror函数的特点



  • strerror函数的头文件:strerror函数界说在errno.h头文件中,因此在使用该函数之前,必须包罗这个头文件。
  • strerror函数的返回值 :strerror函数的返回值是一个指向错误消息字符串的指针,这个消息字符串即为堕落信息的字符串。假如函数调用乐成,返回值是指向错误信息字符串的指针;假如发生错误,则返回一个空指针(NULL)。
  • strerror函数的注意事项 :必要注意的是,strerror函数不是线程安全的,由于在多线程环境中,多个线程可能会同时调用strerror函数并覆盖errno的值。因此,在多线程步伐中,建议使用strerror_r函数,它是strerror的线程安全版本
  • strerror函数的使用场景:strerror函数通常在体系调用或库函数堕落时使用。当这些函数返回错误时,会设置errno变量,此时可以使用strerror函数将errno的值转换为人类可读的错误信息,便于调试和日志日志记载。
strerror函数的使用


  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. int main()
  6. {
  7.         //打开文件
  8.         FILE* pf = fopen("text.exe", "r");
  9.         if (pf == NULL)
  10.         {
  11.                 printf("%s\n", strerror(errno));
  12.         }
  13.         //读文件
  14.         //关闭文件
  15.         fclose(pf);
  16.         pf = NULL;
  17.         return 0;
  18. }
复制代码
输出效果:


在此我们瞥见我们还必要写一个输出语句,那么我们还可以使用perror函数,可以更加直接明白的发现错误


perror=printf+error

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. int main()
  6. {
  7.         //打开文件
  8.         FILE* pf = fopen("text.exe", "r");
  9.         if (pf == NULL)
  10.         {
  11.                 //printf("%s\n", strerror(errno));
  12.                 perror("fopen");
  13.                 return 1;
  14.         }
  15.         //读文件
  16.         //关闭文件
  17.         fclose(pf);
  18.         pf = NULL;
  19.         return 0;
  20. }
复制代码
输出效果:



memcpy

memcpy是C语言中的一个标准库函数,用于将源内存地区的内容复制到目标内存地区。


memcpy函数的特点



  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 '\0' 的时间并不会停下来。
  • 假如source和destination有任何的重叠,复制的效果都是未界说的。
memcpy函数与strcpy函数的区别

1. 复制内容


  • strcpy:专门用于复制字符串,它会不停复制直到遇到源字符串中的 '\0'竣事符。
  • memcpy:可以复制恣意内容,如字符数组、整型、布局体、类等。它按照指定的字节数进行复制,而不是基于 '\0' 竣事符。
2. 函数原型


  • strcpy: char* strcpy(char* dest, const char* src); ,返回指向目标缓冲区 `dest` 的指针。
  • memcpy:void* memcpy(void* dest, const void* src, size_t n); ,此中 n 是要复制的字节数,同样返回指向目标缓冲区 dest 的指针 。
3. 安全性


  • strcpy :由于其不查抄目标缓冲区的巨细,若源字符串长度凌驾了目标缓冲区的巨细(不包罗 '\0' ),就 会发生缓冲区溢出,这是一个常见的安全隐患。比方,目标缓冲区只能容纳 5 个字符,而源字符串有 10 个字符,使用 ` strcpy 就会导致溢出 。
  • memcpy :固然它提供了复制字节数的选项,但假如指定了错误的字节数或目标缓冲区巨细不敷,也可能导致标题。不外,由于其提供了明白的字节数,以是相比于 strcpy ,它在某些环境下可能更安全 。
4. 用途


  • strcpy :紧张用于字符串的复制。当明白知道要复制的是字符串时,使用 strcpy 较为方便。
  • memcpy :用于复制恣意范例的内存块,特别是当必要复制的数据中可能包罗 '\0' 字符时(由于 strcpy 在遇到 '\0' 时会制止复制)。比方,复制一个包罗图像数据的内存块,就必要使用 memcpy 。
5. 实现方式


  • strcpy :通过逐个字符复制直到遇到 '\0' 竣事符来实现字符串的复制。
  • memcpy :通过逐个字节复制来实现内存块的复制,直到达到指定的字节数 `n`。在地点不对齐的环境下,它是一个字节一个字节地拷,地点对齐以后,就会使用 CPU 字长(32bit 或 64bit)来拷,还会根据 CPU 的范例选择一些优化的指令来进行拷贝 [[4]()]。
6. 服从 :在拷贝相同字符串和字节数时,`strcpy` 的服从略高于 `memcpy`。不外 `memcpy` 是一个服从较高的内存拷贝函数,实在现与 CPU 范例、操纵体系、cLib 干系。
memcpy函数的使用

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. int main()
  5. {
  6.         int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
  7.         int arr2[10] = { 0 };
  8.         memcpy(arr2, arr1, 20);
  9.         int i = 0;
  10.         for (i = 0;i < 5;i++)
  11.         {
  12.                 printf("%d ", arr2[i]);
  13.         }
  14.         return 0;
  15. }
复制代码
memmove

memmove函数是C语言中用于内存操纵的一个紧张工具,它紧张用于从源内存地区拷贝一定命目的字节到目标内存地区。memmove函数的一个明显特点是它可以处置惩罚源内存地区和目标内存地区重叠的环境,这使得它在处置惩罚某些特定的内存操纵时非常有效


memmove函数的特点

1. 处置惩罚内存重叠
Memmove函数的一个明显特点是它可以处置惩罚源内存区和目标内存区重叠的环境。这意味着,假如源内存区和目标内存区的部门地区重叠,memmove仍然可以正确地复制字节,而不会像memcpy那样导致数据粉碎。
2. 内存操纵的安全性
由于memmove能够处置惩罚内存重叠,它在进行内存操纵时更加安全。当源和目标内存地区重叠时,memmove会从高地点向低地点进行拷贝,以确保数据的正确性和完备性。
3. 返回值
Memmove函数的返回值是指向目标内存区的指针。这一点与memcpy相同。
4. 使用场景
Memmove通常在必要处置惩罚内存重叠的环境下使用,比方在字符串操纵中移动字符串,或者在数组中移动元素。它的这些特点使得它在C语言编程中成为一个非常有效的工具。
5. 实现细节
固然memmove的具体实现可能会有所不同,但它的根本头脑是使用中心缓冲区的方式来复制数据,从而答应目标和源重叠。这种实现方式确保了数据的安全复制。
memmove函数的使用

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. int main()
  5. {
  6.         char str[] = "memmove can be very useful......";
  7.         memmove(str + 20, str + 15, 11);
  8.         puts(str);
  9.         return 0;
  10. }
复制代码

memset

memset函数的作用是将指针变量s所指向的前n字节的内存单位用一个整数c更换。这个函数通常用于新申请的内存做初始化工作,比方将一段内存空间全部设置为某个字符,一样平常用在对界说的字符串进行初始化为'''/0'.


memset函数的特点

1. 内存空间初始化
memset函数紧张用于内存空间的初始化。它可以将一段内存空间全部设置为某个字符,通常用在对界说的字符串进行初始化为''或'\0'。比方,可以使用memset将一个字符数组初始化为空字符串2memset()函数及其作用_cc2530 memset(re,0,20)。
2. 清空布局体变量或数组
memset可以方便地清空一个布局范例的变量或数组。这对于大型数据布局的快速清零非常有效,制止了手动逐个成员清零的繁琐1memset()函数及其作用。
3. 字节级操纵
memset函数以字节为单位进行操纵,这意味着它可以将指定内存地区的每个字节设置为相同的值。这使得它非常适适用于初始化或清空原始内存块2memset()函数及其作用_cc2530 memset(re,0,20)。
4. 快速操纵
对于较大的布局体或数组,memset是进行清零操纵的一种最快方法。它的实现通常是优化过的,能够在较短时间内完成大量内存的初始化
memset函数的使用

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. int main()
  5. {
  6.         char str[] = "haha xixi yesyes nono.";
  7.         memset(str, '@', 10);
  8.         puts(str);
  9.         return 0;
  10. }
复制代码
输出效果:



memcmp

memcmp 函数是C语言中的一个标准库函数,用于比力两个内存地区的内容。


memcmp函数的特点


  • 逐字节比力:memcmp函数是按字节比力的,它逐个比力内存地区buf1和buf2的前count个字节。
  • ASCII码比力:memcmp函数比力的是字节的ASCII码值,而不是字符的实际意义。
  • 返回值:当buf1小于buf2时,返回值小于0;当buf1即是buf2时,返回值即是0;当buf1大于buf2时,返回值大于0。
  • 不受字符串竣事符影响:与strcmp函数不同,memcmp函数不会受到字符串竣事符(如'\0')的影响,它只比力前count个字节。
  • 适用范围:memcmp函数不光可以用于比力字符串,还可以用于比力任何范例的内存地区,这使得它在处置惩罚二进制数据时非常有效。
  • 服从:由于memcmp函数不必要寻找字符串竣事符,因此在处置惩罚大型数据块时,它的服从通常比strcmp函数高。
memcmp函数的使用

  1. #define  _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<string.h>
  4. int main()
  5. {
  6.         char str1[] = "abgrdsd";
  7.         char str2[] = "nxcjkdbc";
  8.         int n = 0;
  9.         n = memcmp(str1, str2, sizeof(str1));
  10.         if (n > 0)
  11.                 printf("str1>str2\n");
  12.         else if(n == 0)
  13.                 printf("str1=str2\n");
  14.         else
  15.                 printf("str1 < str2");
  16.         return 0;
  17. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表