【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

03-01 1811阅读

  🌈write in front :

🔍个人主页 : @啊森要自信的主页

✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊!

欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我们一起探讨学习交流,一起加油鸭。 【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

文章目录

  • 📝前言
  • 🌠 库函数strncpy
    • 🌉strncpy 模拟实现
    • 🌠strncat 函数的使⽤
      • 🌉strncat 模拟实现
      • 🌠strncmp函数的使⽤
        • 🌉strncmp模拟实现
        • 🌠strerror
          • 🌉 perror
          • 🚩总结

            📝前言

            本小节,阿森继续和你一起学习5个字符串函数:strncpy,strcnat,strncmp的使用和两种模拟实现方法,他们和strcpy等函数比较多了一个n ,实现方法有很大区别,还有strerror和perror的使用,学习这些库函数,可以更好的方便操作字符和字符串,文章干货满满,接下来我们就学习一下这些函数吧!


            strcpy、strcat这类函数不安全,因为它们在复制字符串时不检查目标缓冲区的大小,可能会导致缓冲区溢出。

            而strncpy、strncat、strncmp这类函数相对来说更安全,因为它们在复制/追加字符串时会限定最大长度参数n,避免无限制地写入目标缓冲区。

            点击—>手把手教你配置VS的常见函数如何不报错!

            【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

            🌠 库函数strncpy

            strncpy函数用于将一个字符串拷贝到另一个字符串中,可以限定拷贝的字符数。

            函数原型:

             char * strncpy ( char * destination, const char * source, size_t num );
              dest - 目标字符串,用于接收拷贝内容。
              src - 源字符串,从中拷贝内容。 
              num - 要拷贝的字符数。
            

            返回值:

            返回目标字符串dest的指针。

            注意点:

            • 检查dest空间是否足以容纳src的n个字符及结尾'\0'。strncpy不会检查dest的长度,如果dest空间不足可能会导致缓冲区溢出。

            • 拷⻉num个字符从源字符串到⽬标空间。拷贝num个就num个,不会拷贝多,也不会自己添加\0。

              【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

            • 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

              【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

              例子:

              # define _CRT_SECURE_NO_WARNINGS 1
              #include 
              #include 
              int main()
              {
              	char str1[] = "Hello World";
              	char str2[7];
              	str2[5] = '\0';
              	strncpy(str2, str1, 5);
              	printf("str1: %s\n", str1);
              	printf("str2: %s\n", str2);
              	return 0;
              }
              

              输出:

              str1: Hello World
              str2: Hello
              

              🌉strncpy 模拟实现

              对于strncpy函数,阿森给你带来了两种模拟实现方法,详解如下:

              • 主函数(两种模拟实现都可以用这个进行测试)
                int main() 
                {
                    char dest[20]="xxxxxxxxxxxxxxxxx";
                    char src[] = "hello";
                	size_t set = strlen(src);
                	printf("%d\n", set);
                	my_strncpy(dest, src, 3);
                    printf("%s\n", dest);
                    my_strncpy(dest, src, 9);
                    printf("%s\n", dest);
                    return 0;
                }
                
                1. 用数组模拟实现
                char* my_strncpy(char* dest, const char* src, size_t n) 
                {
                    if (dest == NULL || src == NULL) //检查dest和src参数是否合法,如果任意一个为NULL则直接返回NULL。
                    {
                        return NULL;
                    }
                    char* result = dest;// 保存dest的地址值,后面返回时使用
                    
                    size_t i;
                    for ( i = 0; i  
                

                输出:

                5
                helxxxxxxxxxxxxxx
                hello
                

                调试界面:

                【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

                1. 用指针实现
                char* my_strncpy(char* dest, const char* src, size_t n)
                {
                    assert(dest);//利用断言需要使用头文件#include
                    assert(src);
                    char* destPtr = dest;//定义dest和src的指针变量destPtr和srcPtr,用于遍历字符串。
                    const char* srcPtr = src;
                    while (n-- > 0) //使用while循环遍历n个字符
                    {
                        if (*srcPtr != '\0')  //检查当前源字符串srcPtr指向的字符是否为'\0'结束符
                        {
                            *destPtr++ = *srcPtr++;//如果不是结束符,就将源字符串当前字符复制到目标字符串,
                        }										//并同时将两个指针前移到下一个字符。
                        else //如果是结束符,进入else块
                        {
                            *destPtr++ = '\0';//将目标字符串当前字符设置为结束符'\0'
                        }							  //然后destPtr再++
                    }
                    
                    return dest; //返回目标字符串首地址。
                }
                

                输出:

                【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

                *destPtr++ = *srcPtr++先进行一次赋值(*dest = *src),然后并使指针后移(dest=dest+1,src=src+1)

                *destPtr++ = ‘\0’将目标字符串当前字符设置为结束符'\0',然后destPtr再++

                🌠strncat 函数的使⽤

                strncat函数用于连接两个字符串,将源字符串src连接到目标字符串dest的结尾,最多连接n个字符。

                strncat函数的原型:

                char *strncat(char *dest, const char *src, size_t n);
                 dest:目标字符串,其内容将在其后追加源字符串内容。
                 src:源字符串,其内容将被追加到目标字符串结尾。 
                 n:要从源字符串中追加到目标字符串中的最大字符数。
                
                • 返回值:

                  函数返回目标字符串dest的指针。

                  例子:

                  #include 
                  int main()
                  {
                  	char dest[100] = "Hello";
                  	char src[] = " World";
                  	strncat(dest, src, 6);
                  	printf("%s\n", dest);
                  }
                  

                  输出:

                  输出 Hello World
                  

                  🌉strncat 模拟实现

                  • 主函数
                    int main()
                    {
                        char str1[100] = "hello";
                        char str2[100] = " world";
                        my_strncat(str1, str2, 5);
                        printf("%s\n", str1);
                        return 0;
                    }
                    
                    1. 用数组模拟实现
                    char* my_strncat(char* dst, const char* src, size_t n)
                    {
                        char* tmp = dst;
                        while (*dst)//使用while循环遍历dst字符串。
                        {
                            dst++;//找到字符串结束位置'\0'。
                        }
                        int i;
                        for (i = 0; src[i] && i  
                    

                    输出:

                    hello worl
                    

                    【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

                    1. 用指针实现
                    char* my_strncat(char* dest, const char* src, size_t n)
                    {
                        //参数检查
                        if (dest == NULL || src == NULL)
                        {
                            return NULL;
                        }
                        char* ptr = dest;
                        //找到目标字符串结尾
                        while (*dest != '\0')
                        {
                            dest++;
                        }
                        while (n-- > 0 && *src != '\0')
                        {
                            *dest++ = *src++;
                        }
                        *dest = '\0';
                        return ptr;//添加字符串结束符
                    }
                    

                    输出:

                    【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

                    首先,n-- 表示先使用 n 的值来进行比较是否>0,因为&& 是逻辑与运算符,*src != ‘\0’ 表示判断指针 src 所指向的字符是否为字符串的结束符 \0,这两个条件验证真假后,最后 n 的值才减 1。

                    🌠strncmp函数的使⽤

                    strncmp用于比较两个字符串的前n个字符。(比较的不是字符串的长度无关,只与对应位置的字符内容有关。)

                    strncmp函数原型:

                    int strncmp(const char *str1, const char *str2, size_t n);
                    str1 - 要比较的第一个字符串的指针
                    str2 - 要比较的第二个字符串的指针  
                    n - 将被比较的最大字符数
                    

                    返回值:

                    • 如果str1小于str2,返回值小于0
                    • 如果str1大于str2,返回值大于0
                    • 如果str1等于str2,返回值等于0

                      注意点:

                      1. 如果n的值大于两个字符串中任意一个字符串的长度,比较将会超出字符串的范围,可能导致内存访问错误。因此,在使用strncmp函数时,需要确保n的值不会超过任意一个字符串的长度。

                      2. strncmp函数返回的结果是一个整数,可以通过结果的正负值来判断两个字符串的大小关系。

                      3. 比较规则与strcmp函数一致,按ASCII码顺序比较每个字符。

                      使用示例:

                      int main()
                      {
                      	char str1[] = "hello";//注意字符串结尾后面还有\0
                      	char str2[] = "hello world";
                      	int result1 = strncmp(str1, str2, 5);
                      	// 只比较前5个字符,结果为0,表示相等
                      	printf("%d\n", result1);
                      	int result2 = strncmp(str1, str2, 6);
                      	// 比较前6个字符,结果为负数,表示str1小于str2
                      	printf("%d\n", result2);
                      }
                      

                      输出:

                      【C语言】超详解strncpy&&strncat&&strncmp&&strerror&&perror的使⽤和模拟实现

                      🌉strncmp模拟实现

                      int my_strncmp(const char* s1, const char* s2, size_t n)
                      {
                          int i = 0;
                         			//这是一个 for 循环,用于迭代比较两个字符串中的字符。
                          for (; i 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]