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


    前段时间也是把指针较为详细系统的讲解完毕,接下来介绍一个全新的知识点,就是字符函数和字符串函数

    前几期文章可进我主页观看:总之就是非常唔姆_Matlab,经验分享,c语言题目分享-CSDN博客

    想要源代码可以去我的github看看Nerosts/just-a-try: 学习c语言的过程、真 (github.com) 


    目录

     一.求字符串长度

    1.strlen() 

    1.1示例 

    1.2注意事项 

    1.3模拟实现:

     二.长度不受限制的字符串函数

    1.strcpy()

    1.1示例 

    1.2注意事项 

    1.3模拟实现

    2.strcat()

    2.1示例 

     2.2注意事项

     2.3模拟实现

    3.strcmp()

    3.1示例

     3.2注意事项

    3.3模拟实现

     三.长度受限制的字符串函数介绍

    1.strncpy()

     1.1示例

    1.2注意事项

    2.strncat()

     2.1示例

    2.2注意事项

     3.strncmp()

    3.1示例

     3.2注意事项


     一.求字符串长度

    1.strlen() 

    当我们需要确定一个字符串的长度时,可以使用字符串函数 strlen()

    strlen() 函数的原型如下:

    #include

    size_t strlen(const char *str);

    这个函数接受一个指向字符串的指针作为参数,并返回一个 size_t 类型的值,表示字符串中字符的数量

    strlen() 函数的工作原理很简单。它会从给定的字符串的第一个字符开始,逐个检查每个字符,直到遇到字符串的结尾标志 \0。在这个过程中,它会计算字符的数量,并最终返回该数量。

    1.1示例 

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int main()
    5. {
    6. char arr[] = "hello";
    7. printf("%s的长度是%d", arr, strlen(arr));
    8. return 0;
    9. }

    结果便是: 

    1.2注意事项 

    但是我们知道最后是有\0的

     所以我们可以得知:strlen() 函数只计算字符串中字符的数量,并不包括结尾的空符 \0

    1.3模拟实现:

    三种方式:

            1.计数器的方式

            2.递归的方式

            3.指针-指针的方式

    计数器的方式:

    1. size_t my_strlen(char* pa)
    2. {
    3. assert(pa);
    4. int count = 0;
    5. while (*pa)
    6. {
    7. count++;
    8. pa++;
    9. }
    10. return count;
    11. }
    12. int main()
    13. {
    14. char arr[] = "hello";
    15. printf("%s的长度是%d", arr, my_strlen(arr));
    16. return 0;
    17. }

     递归的方式:

    1. size_t my_strlen(char* pa)
    2. {
    3. if (*pa)
    4. {
    5. return my_strlen(pa + 1) + 1;
    6. }
    7. else
    8. {
    9. return 0;
    10. }
    11. }
    12. int main()
    13. {
    14. char arr[] = "hello";
    15. printf("%s的长度是%d", arr, my_strlen(arr));
    16. return 0;
    17. }

    指针-指针的方式:

    1. size_t my_strlen(char* pa)
    2. {
    3. char* start = pa;
    4. while (*pa)
    5. {
    6. pa++;
    7. }
    8. return pa - start;
    9. }
    10. int main()
    11. {
    12. char arr[] = "hello";
    13. printf("%s的长度是%d", arr, my_strlen(arr));
    14. return 0;
    15. }


     二.长度不受限制的字符串函数

    1.strcpy()

    strcpy() 函数用于将源字符串复制到目标字符串中

    strcpy() 函数的原型如下:

    #include

    char *strcpy(char *dest, const char *src);

    这个函数接受两个参数:dest 和 srcdest 是目标字符串,src 是源字符串。函数会将源字符串中的内容复制到目标字符串中,并返回指向目标字符串的指针。

    strcpy() 函数的工作原理很简单。它会从源字符串的第一个字符开始,逐个复制每个字符,直到遇到字符串的结尾标志 \0。在这个过程中,它会将每个字符复制到目标字符串的相应位置。

    1.1示例 

    1. int main()
    2. {
    3. char src[] = "Hello, world!";
    4. char dest[20];
    5. strcpy(dest, src);
    6. printf("The copied string is: %s\n", dest);
    7. return 0;
    8. }

    结果如下: 

    1.2注意事项 

     strcpy() 函数会复制整个源字符串,包括结尾的空字符 \0。所以,在使用 strcpy() 函数时,目标字符串的长度应该足够长,以便能够容纳源字符串的所有字符

    \0也在里面

    1.3模拟实现

    1. char* my_strcpy(char* dest, char* src)
    2. {
    3. while (*src)
    4. {
    5. *dest = *src;
    6. dest++;
    7. src++;
    8. }
    9. *dest = *src;
    10. }
    11. int main()
    12. {
    13. char src[] = "Hello, world!";
    14. char dest[20];
    15. my_strcpy(dest, src);
    16. printf("The copied string is: %s\n", dest);
    17. return 0;
    18. }

    结果如下: 

    依然可以进一步优化:

    1. char* my_strcpy(char* dest, char* src)
    2. {
    3. char* ret = dest;
    4. while (*dest++ = *src++)
    5. {
    6. ;
    7. }
    8. return ret;
    9. }
    10. int main()
    11. {
    12. char src[] = "Hello, world!";
    13. char dest[20];
    14. my_strcpy(dest, src);
    15. printf("The copied string is: %s\n", dest);
    16. return 0;
    17. }

    2.strcat()

    strcat() 函数用于将源字符串追加到目标字符串的末尾

    strcat() 函数的原型如下:

    #include

    char *strcat(char *dest, const char *src);

    这个函数接受两个参数:dest 和 srcdest 是目标字符串,src 是源字符串。函数会将源字符串中的内容追加到目标字符串的末尾,并返回指向目标字符串的指针。

    strcat() 函数的工作原理很简单。它会从目标字符串的结尾开始,逐个复制源字符串的字符,直到遇到源字符串的结尾标志 \0。在这个过程中,它会将每个字符追加到目标字符串的末尾

    2.1示例 

    1. int main()
    2. {
    3. char arr1[20] = "hello";
    4. char arr2[] = " world";
    5. printf("%s", strcat(arr1, arr2));
    6. return 0;
    7. }

     

     2.2注意事项

    目标字符串必须具有足够的空间来存储源字符串的内容,否则会导致缓冲区溢出错误,目标字符串的长度应该足够长,以便能够容纳添加后的所有字符

     2.3模拟实现

    1. char* my_strcat(char* dest, char* src)
    2. {
    3. char* ret = dest;
    4. while (*dest)
    5. {
    6. dest++;
    7. }
    8. while (*src)
    9. {
    10. *dest = *src;
    11. dest++;
    12. src++;
    13. }
    14. *dest = *src;
    15. return ret;
    16. }
    17. int main()
    18. {
    19. char arr1[20] = "hello";
    20. char arr2[] = " world";
    21. printf("%s", my_strcat(arr1, arr2));
    22. return 0;
    23. }

    3.strcmp()

    strcmp() 函数用于比较两个字符串的大小关系

    strcmp() 函数的原型如下:

    #include

    int strcmp(const char *str1, const char *str2);

    这个函数接受两个参数:str1 和 str2,它们分别是要比较的两个字符串。函数会比较这两个字符串的内容,并返回一个整数值来表示它们的大小关系。

    strcmp() 函数的返回值有以下三种可能:

    • 如果 str1 等于 str2,则返回值为 0。
    • 如果 str1 小于 str2,则返回值为一个负整数(通常是 -1)。
    • 如果 str1 大于 str2,则返回值为一个正整数(通常是 1)。

    strcmp() 函数的比较是按照字典顺序进行的,即按照字符的 ASCII 值进行比较。它会逐个比较两个字符串中相应位置的字符,直到遇到不相等的字符或者遇到字符串的结尾标志 \0。在比较过程中,如果发现两个字符不相等,就会根据它们的 ASCII 值来确定它们的大小关系。

    3.1示例

    1. int main()
    2. {
    3. char arr1[] = "abc";
    4. char arr2[] = "aec";
    5. int result = strcmp(arr1, arr2);
    6. if (result < 0) {
    7. printf("arr1 is less than arr2\n");
    8. }
    9. else if (result > 0) {
    10. printf("arr1 is bigger than arr2\n");
    11. }
    12. else {
    13. printf("arr1 is equal to arr2\n");
    14. }
    15. return 0;
    16. }

    结果如下:

     3.2注意事项

    strcmp() 函数比较的是字符串的内容,而不是字符串的长度。所以,在使用 strcmp() 函数时,需要确保两个字符串的内存地址是有效的,并且包含了正确的字符串内容

    3.3模拟实现

    1. int my_strcmp(char* arr1, char* arr2)
    2. {
    3. while (*arr1 == *arr2)
    4. {
    5. if (*arr1 == '\0' && *arr2 == '\0')
    6. {
    7. return 0;
    8. }
    9. arr1++;
    10. arr2++;
    11. }
    12. return *arr1 - *arr2;
    13. }
    14. int main()
    15. {
    16. char arr1[] = "abc";
    17. char arr2[] = "aec";
    18. int result = my_strcmp(arr1, arr2);
    19. if (result < 0) {
    20. printf("arr1 is less than arr2\n");
    21. }
    22. else if (result > 0) {
    23. printf("arr1 is bigger than arr2\n");
    24. }
    25. else {
    26. printf("arr1 is equal to arr2\n");
    27. }
    28. return 0;
    29. }

    结果如下:


     三.长度受限制的字符串函数介绍

    1.strncpy()

    strncpy() 函数是C语言中的一个字符串函数,用于将一个字符串的一部分复制到另一个字符串中

    strncpy() 函数的原型如下:

    1. #include
    2. char *strncpy(char *dest, const char *src, size_t n);

    这个函数接受三个参数:destsrc 和 ndest 是目标字符串,src 是源字符串,n 是要复制的字符数。

    strncpy() 函数会将源字符串中的前 n 个字符复制到目标字符串中,不包括结尾的空字符 \0。如果源字符串的长度小于 n,则会将剩余的字符用空字符 \0 填充。

     1.1示例

    1. int main()
    2. {
    3. char src[] = "Hello, World!";
    4. char dest[20];
    5. strncpy(dest, src, 5);
    6. dest[5] = '\0';
    7. printf("Copied string: %s\n", dest);
    8. return 0;
    9. }

    结果如下: 

    1.2注意事项

    需要注意的是,strncpy() 函数不会自动在目标字符串的末尾添加空字符 \0

    所以,在使用 strncpy() 函数复制字符串后,需要手动在目标字符串的末尾添加空字符 

    2.strncat()

    strncat() 函数是C语言中的一个字符串函数,用于将一个字符串的一部分连接到另一个字符串的末尾

    strncat() 函数的原型如下:

    #include

    char *strncat(char *dest, const char *src, size_t n);

    这个函数接受三个参数:destsrc 和 ndest 是目标字符串,src 是源字符串,n 是要连接的字符数。

    strncat() 函数会将源字符串中的前 n 个字符连接到目标字符串的末尾,并返回指向目标字符串的指针。如果源字符串的长度小于 n,则会将整个源字符串连接到目标字符串的末尾

     2.1示例

    1. #include
    2. #include
    3. int main()
    4. {
    5. char dest[20] = "Hello, ";
    6. char src[] = "World!";
    7. strncat(dest, src, 5);
    8. printf("Connected string: %s\n", dest);
    9. return 0;
    10. }

    结果如下:

    2.2注意事项

    strncat() 函数会根据目标字符串的长度和要连接的字符数来确定是否有足够的空间来存储连接后的字符串。在使用 strncat() 函数连接字符串时,需要确保目标字符串具有足够的空间来存储连接后的结果 

     3.strncmp()

    strncmp() 函数是C语言中的一个字符串函数,用于比较两个字符串的前 n 个字符是否相等

    strncmp() 函数的原型如下:

    #include

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

    这个函数接受三个参数:str1str2 和 nstr1 和 str2 是要比较的两个字符串,n 是要比较的字符数。

    strncmp() 函数会比较 str1 和 str2 的前 n 个字符。如果这些字符完全相等,则返回值为0。如果两个字符串在前 n 个字符中有差异,则返回值为一个正整数或负整数,表示第一个不同字符的 ASCII 码差值

    3.1示例

    1. int main() {
    2. char str1[] = "Hello";
    3. char str2[] = "Hell";
    4. int result = strncmp(str1, str2, 4);
    5. if (result == 0)
    6. {
    7. printf("The first 4 characters of str1 and str2 are equal.\n");
    8. }
    9. else if (result < 0)
    10. {
    11. printf("The first different character in str1 is smaller than the corresponding character in str2.\n");
    12. }
    13. else
    14. {
    15. printf("The first different character in str1 is bigger than the corresponding character in str2.\n");
    16. }
    17. return 0;
    18. }

     3.2注意事项

    strncmp() 函数会在比较过程中遇到以下情况时停止比较:

    • 两个字符串的前 n 个字符完全相等
    • 已经比较了 n 个字符

    如果两个字符串的长度不足 n,则会比较字符串的实际长度。因此,在使用 strncmp() 函数比较字符串时,需要确保字符串的长度足够,并且注意比较的字符数是否正确


    今天的内容就梳理到这里了,接下来我会继续进行梳理的。感谢大家支持!!! 


     


     

  • 相关阅读:
    vue3使用v-model控制子组件进行双向数据绑定
    java-ssm-jsp-基于ssm的宠物领养系统的设计与实现
    每天一个注解之 @WebMethod
    高并发下丢失更新的解决方案
    Flink-常用算子、自定义函数以及分区策略
    正文Delphi XE Android下让TMemo不自动弹出键盘
    Seata流程源码梳理下篇-TC
    如何使用 etcd 实现分布式 /etc 目录
    JWT介绍
    redis的事务、锁机制、秒杀
  • 原文地址:https://blog.csdn.net/qq_74415153/article/details/133609037