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 }