C语言实现对strncpy等各种函数的实现(分层) -- 不定时更新 -- 20210519

20210519--更新实现strncpy函数

    Ps:此函数之后的的所有函数,只更新 str.c 函数

    设计:分层实现;str.h 是自定义头文件,str.c是 strncpy 函数功能的具体实现,main.c 主函数

               编写 strncpy.c, 思路 : (1) get_str2 为要复制字串,最好不要改变。

                                                        (2)这里直接使用 strlen(get_str2);函数来计算字串长度,不自定义函数编写

                                                        (3)条件判断,int size 就是要copy多少字节;这里拿 size 与 get_str2 进行判断

              编写main.c , 思路 : 正常赋值调用

     (20210520 -- 更新采用typedef函数指针,调用执行函数)

  代码:

      

         str.h

  1 #ifndef __STR_H__                                                                                                                                                       
  2 #define __STR_H__
  3 
  4 #define SIZE 20
  5 typedef char *(*Strtype)(char *,const char *,int);

    // typedef了一个 char *(*)(char *,const char *,int); 类型
  6 
  7 char *my_strncpy(char *input_str1,const char *get_str2,int size);
  8 
  9 
 10 
 11 #endif

    

         str.c

  1 #include "str.h"                                                                                                                                                        
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 
  6 
  7 char *my_strncpy(char *input_str1,const char *get_str2,int size)
  8 {
  9     int size_s = strlen(get_str2);
 10     int i = 0;
 11 
 12     if ((size <= size_s && size >= 0) || size >= size_s)
 13     {
 14         for(i = 0; i < size; i++)
 15         {
 16             *input_str1 = *get_str2;
 17 
 18             input_str1++;
 19             get_str2++;
 20 
 21         }
 22         *input_str1 = '\0';
 23         return input_str1;
 24 
 25     }
 26     else
 27     {
 28         memset(input_str1,'\0',size_s);
 29         return input_str1;
 30     }
 31 
 32 }

        main.c

  1 #include "str.h"                                                                                                                                                        
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 
  5 int main(void)
  6 {
  7 
  8     char str1[SIZE] = {0};
  9     char str2[SIZE] = "hello wor";
 10 
 11 
 12 	Strtype Tstrncpy = NULL;
 13     Tstrncpy = my_strncpy;
 14     Tstrncpy(str1,str2,3);
 15     
 16     printf("str1 = %s\n",str1);
 17 
 18     return 0;
 19 }

      20210519--更新strcat函数实现    

        依旧按照上面分层步骤,str.c 实现 strcat函数具体功能,str.h中声明,完成之后 main.c 调用


char *my_strcat(char *output_str1, const char *get_str2)
{
	while(*output_str1 != '\0') /*找str1的尾零位置*/
		output_str1++;

	 while((*output_str1++ = *get_str2++) && (*get_str2 != '\0'));

	return output_str1;
}


//20210526 更新,下面这个是 man 手册里给的strncat的例子,很精简

char *my_strncat(char *output_str1,const char *get_str2,int n)
{
    int str1_len = strlen(output_str1); //获取原字串的长度,类似于上面 也是找尾零 
    int num = 0;

    for(num = 0; num < n && get_str2[num] != '\0'; i++)
    {
        output_str1[str1_len + num] = get_str2[num]; // 将str2逐步cpy进str1

       output_str1[str1_len + num] = '\0'; // 补上尾零

    }
    return output_str1;

}

  20210519--更新strncmp函数实现

      依旧按照上面分层步骤,str.c 实现 strcat函数具体功能,str.h中声明,完成之后 main.c 调用

    

    while循环里条件的含义:1, 条件(num < size) 传入size过大:另外3个条件防止传入的 size 过大。
        
          如何判定过大?
             如 str1长度为4 大于 str2长度为3,此时的size就过大。


         str1和str2相等长度,size远远大于二者;*get_str1 == *get_str2 终止,进行比较。

 65 int my_strncmp(const char *get_str1,const char *get_str2,int size)
 66 {
 67     int num = 0,ret = 0;

 68     /*条件判断 三个 && 包含了我能想到的所有可能(欢迎补充)*/
         
           
 69     while((*get_str2 != '\0') && (*get_str1 != '\0') && (*get_str1 == *get_str2) && (num < size))
 70     {
 71         get_str1++;
 72         get_str2++;
 73         num++;
 74     }
 75     
 76     ret = *get_str1 - *get_str2;
 77 
 78     return ret;
        /* 返回值是在 main里面做文章*/
 79     
 80 }

 


版权声明:本文为weixin_52372485原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。