• 字符串函数【C语言-2】


    🍠订阅专栏: 字符串函数

    🍅关注博主:翻斗花园第一代码手牛爷爷

    目录

     🍍前言

    🌽函数介绍

    🏡strncpy函数

    🍐 strncpy函数使用

    🍓strncpy函数模拟实现

    🍉strncat函数

    🍚 strncat函数使用

    🍎strncat函数模拟实现

    🍊strncmp函数

    🍒strncmp函数使用

     🍭strncmp函数模拟实现

    👕strstr函数

    👚strstr函数使用

    🎸strstr模拟实现

    🍚 总结


     

     🍍前言

    在第一篇中我们介绍了几种字符串函数,今天我们接上第一篇继续介绍字符串函数,对其功能进行模拟实现,注意事项进行说明标出。

    🌽函数介绍

    🏡strncpy函数

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

    有限制字符串拷贝函数

    •  拷贝num个字符从源字符串到目标空间
    • 如果源字符串长度小于num,则拷贝完源字符串后,在目标空间的后面追加 \0 直到num个。

    🍐 strncpy函数使用

    strncpy函数和strcpy函数非常类似,区别在于一个有限制一个没有限制,下面我们用代码来看strncpy的具体使用。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdefg";
    6. char arr2[] = "****";
    7. printf("%s\n", strncpy(arr, arr2, 2));
    8. return 0;
    9. }
    '
    运行

    我们从arr2数组中拷贝2个字符到arr数组中,然后打印观察结果,运行结果如图:

     我们知道arr2数组的大小为arr[5],当我们要从arr2数组中拷贝6个字符到arr数组中去,又会是怎么样的结果呢,我们还是用代码来观察。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdefg";
    6. char arr2[] = "****";
    7. printf("%s\n", strncpy(arr, arr2, 6));
    8. return 0;
    9. }
    '
    运行

    运行结果如图:

     单靠运行结果图我们难以观察,我们再通过监视图观查,如下图:

     通过上面两个图我们可以看出,当源字符串长度小于num时,会在目标空间的后面继续补上 \0 ,直到num个。

    🍓strncpy函数模拟实现

    1. #include
    2. #include
    3. char* my_strncpy(char* arr, char* arr2, int num)
    4. {
    5. int i = 0;
    6. for (i = 0; i < num; i++)
    7. {
    8. if (*(arr2 + i) != '\0')
    9. {
    10. *(arr + i) = *(arr2 + i);
    11. }
    12. else
    13. {
    14. break;
    15. }
    16. }
    17. for (; i < num; i++)
    18. {
    19. *(arr + i) = '\0';
    20. }
    21. return arr;
    22. }
    23. int main()
    24. {
    25. char arr[] = "abcdefg";
    26. char arr2[] = "****";
    27. printf("%s\n", my_strncpy(arr, arr2, 3));
    28. return 0;
    29. }
    '
    运行

    🍉strncat函数

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

    有限制字符串追加函数

    •  在目标字符串的 \0 位置出开始追加。
    • 在追加完毕时会主动补上 \0
    • 追加的最大长度为源字符串的长度加1,当num大于源字符串的长度时,追加的个数还是源字符串的长度加1。(加1是在因为有 \0
    • 目标空间必须足够大,能够存放下源字符串的内容。

    🍚 strncat函数使用

    当使用strncat函数开始追加时,源字符串会在目标字符串的 \0 位置出开始追加,追加完毕后主动补上 \0 ,下面我们用代码观察strncat函数的具体实现。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[20] = "abcde\0iiiiiiiiiiii";
    6. char arr2[] = "***";
    7. printf("%s\n", strncat(arr, arr2, 2));
    8. return 0;
    9. }
    '
    运行

    我们将arr2数组中的2个字符追加到arr数组中,然后打印字符串,运行结果图如下:

    我们在通过监视图观察 \0 的情况。 如下图:

     通过监视图我们可以观察到,在追加2个字符后会补上一个 \0 。如果当num大于源字符串的长度时,又会是什么情况呢?我们继续通过代码观察,代码如下。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[20] = "abcde\0iiiiiiiiiiii";
    6. char arr2[] = "***";
    7. printf("%s\n", strncat(arr, arr2, 6));
    8. return 0;
    9. }
    '
    运行

    我们将arr2数组追加6个字符到arr数组中,我们知道arr2数组的大小为4,num大于arr2数组的长度,运行后我们观察结果,运行结果如图。

     我们在辅以监视图观察。

     通过观察两个图我们可以知道,strncat函数追加的最大长度为源字符串的长度在加上一个 \0 。还有一点我们需要特别注意的是,我们必须先保证目标空间的大小足以放下源字符串。

    🍎strncat函数模拟实现

    1. #include
    2. #include
    3. char* my_strncat(char* arr, char* arr2, int num)
    4. {
    5. int sz = 0;
    6. while (*(arr + sz) != '\0')
    7. {
    8. sz++;
    9. }
    10. for (int i = 0; i < num; i++)
    11. {
    12. if (*(arr2 + i) != '\0')
    13. {
    14. *(arr + sz) = *(arr2 + i);
    15. sz++;
    16. }
    17. else
    18. {
    19. break;
    20. }
    21. }
    22. *(arr + sz) = '\0';
    23. return arr;
    24. }
    25. int main()
    26. {
    27. char arr[20] = "abcdef";
    28. char arr2[] = "****";
    29. printf("%s\n", my_strncat(arr, arr2, 3));
    30. return 0;
    31. }
    '
    运行

    🍊strncmp函数

    int strncmp ( const char * str1, const char * str2, size_t num );

    有限制字符串比较函数

    •  比较的是字符的大小,不是字符串的长度。
    • 函数有返回值,当返回值等于0时,表示两字符串相等,大于0时表示str1大于str2,小于0时表示str1小于str2。

    🍒strncmp函数使用

    strncmp函数与strncmp函数十分相似,都是比较字符的大小,都有返回值。下面我们通过代码来观察,代码如下。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdef";
    6. char arr2[] = "bcde";
    7. printf("%d\n", strncmp(arr, arr2, 2));
    8. return 0;
    9. }
    '
    运行

    我们通过strncmp函数比较arr数组和arr2数组的前2个字符,并且打印返回值,运行结果如下。

     🍭strncmp函数模拟实现

    1. #include
    2. #include
    3. int my_strncmp(char* arr, char* arr2, int num)
    4. {
    5. for (int i = 0; i < num; i++)
    6. {
    7. if (*(arr + i) != *(arr2 + i))
    8. {
    9. return *(arr + i) - *(arr2 + i);
    10. }
    11. }
    12. return 0;
    13. }
    14. int main()
    15. {
    16. char arr[] = "abcde";
    17. char arr2[] = "bcde";
    18. printf("%d\n", my_strncmp(arr, arr2, 3));
    19. return 0;
    20. }
    '
    运行

    👕strstr函数

    1. const char * strstr ( const char * str1, const char * str2 );
    2. char * strstr ( char * str1, const char * str2 );

    字符串查找函数。

    •  在一个字符串中查找另一个字符串,如果存在,返回查找到的字符串的首字符地址,如果不存在,返回空指针。
    • 如果查找到的子串存在多份,则返回第一次出现的字符串的首字符地址。

    👚strstr函数使用

    我们使用代码对strstr函数进行分析观察,代码如下:

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdfabcdeabc";
    6. char arr2[] = "fab";
    7. printf("%s\n", strstr(arr, arr2));
    8. return 0;
    9. }
    '
    运行

    我们用strstr函数在arr数组字符串中查找arr2数组中的字符串,如果查找到返回arr数组中字符 f 的地址,那么打印结果应该为fabcdeabc,运行结果如图。

     我们可以知道strstr函数查找到返回确实是字符串首字符的地址,而当字符串中查找到多份子串时,有是什么结果呢?我们可以通过下面的代码进行观察。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char arr[] = "abcdfabcdefabc";
    6. char arr2[] = "fab";
    7. printf("%s\n", strstr(arr, arr2));
    8. return 0;
    9. }
    '
    运行

    上面代码我们知道arr数组中存在两份 fab 子串,如果返回的是第一次子串的地址的话,那么打印出来的结果就应该是 fabcdefabc ,我们通过运行结果图来进行分析,如下图。

     通过上面的代码我们知道,如果在被查找的字符串中存在多份字串时,返回的还是第一次出现的字串的地址。

    🎸strstr模拟实现

    1. #include
    2. #include
    3. char* my_strstr(char* arr, char* arr2)
    4. {
    5. char* p = arr;
    6. char* q = arr2;
    7. int sz = 0;
    8. int i = 0;
    9. while (*p != '\0' && *q != '\0')
    10. {
    11. if (*p == *q)
    12. {
    13. p++;
    14. q++;
    15. }
    16. else
    17. {
    18. p = arr + 1;
    19. arr = p;
    20. q = arr2;
    21. }
    22. }
    23. if (*p == '\0' && *q != '\0')
    24. {
    25. return NULL;
    26. }
    27. else
    28. {
    29. return arr;
    30. }
    31. }
    32. int main()
    33. {
    34. char arr[] = "abcdfabcdefabc";
    35. char arr2[] = "efab";
    36. printf("%s\n", my_strstr(arr, arr2));
    37. return 0;
    38. }
    '
    运行

    🍚 总结

    本章介绍了strncpy函数,strncat函数,strncmp函数,strstr函数的用法以及模拟实现,接下来也会继续更新字符串函数,关注博主来个一键三连呗,你的支持是我更新的动力。

     

     

  • 相关阅读:
    2023-2028年中国高纯度有机金属市场发展分析及前景投资预测报告
    Functional Programming in Java venkat(12) Working with Resources
    修改npm全局安装模式的路径
    什么是 Web 3.0?(新手入门指南)
    C/C++面经嵌入式面经软件开发面经<28/30>-- 单片机相关(一)
    PyTorch入门学习(十五):现有网络模型的使用及修改
    基于多尺度注意力网络单图像超分(MAN)
    web基础与http协议与配置
    jquery 中input /checkbox/radio/button/select未选中的值/等取值问题
    c++哈希(哈希表开散列实现)
  • 原文地址:https://blog.csdn.net/wzh18907434168/article/details/127033854