你知道这些函数,在复制/追加字符串的时候会加上\0吗?
声明:代码里、0就是代表\0,只是不想转换成拼音而已。。。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
#include <string.h>
//1.模拟实现strlen
//size_t strlen(const char* str); 标准结构,记住返回值是无符号的
//size_t my_strlen(const char* arr)
//{
// assert(arr);
// char* start = arr;
// unsigned int count = 0;
// while (*start++)
// {
// count++;
//
// }
// return count;
//}
//int main()
//{
// char arr[] = "abc\0de";
// unsigned int ret = my_strlen(arr);
// printf("%d\n", ret);
//}
//模拟实现strcpy ,会拷贝、0
//char* strcpy(char* destination, const char* source);
//char* my_strcpy(char* destination, const char* source)
//{
// assert(destination&&source);
// char* a = source;
//
// //char* ret = source;
//
// char* b = destination;
// while (*b++ = *a++)
// {
// ;
// }
// //return ret;
//
// return source; //实现的功能和return ret是一样的
//}
//int main()
//{
// char arr1[] = "xxxxxxxxx";
// char arr2[] = "abc\0d";
// printf("%s\n",my_strcpy(arr1, arr2)); //abc
//
//}
//int main()
//{
// char arr1[50] = "abcdhhh";
// char arr2[] = "e\0fg";
// strcpy(arr1, arr2);
// printf("%s\n", arr1);
//}
//模拟实现strcat 不会把追加字符串的、0加上
//char* strcat(char* destination, const char* source);
//char* my_strcat(char* destination, const char* source)
//{
// assert(destination && source);
// char* start = destination;
// while (*start)
// {
// start++;
// }
// while(*start++ = *source++)
// {
// ;
// }
// return destination;
//}
//int main()
//{
// char arr1[50] = "abcdhhh";
// char arr2[] = "efg";
// printf("%s\n", my_strcat(arr1, arr2));
//}
//int main()
//{
// char arr1[50] = "abcdhhh";
// char arr2[] = "e\0fg";
// strcat(arr1, arr2);
// printf("%s\n",arr1 );
//}
//模拟实现strcmp
//int strcmp(const char* str1, const char* str2);
//int my_strcmp(const char* str1, const char* str2)
//{
// assert(str1 && str2);
// while (*str1 == *str2)
// {
// if (*str1 == '\0')
// {
// return 0;
// }
// str1++; str2++;
// }
// return *str1 -* str2;
//}
//int main()
//{
// char arr1[] = "abcde";
// char arr2[] = "abcdf";
// printf("%d\n", my_strcmp(arr1, arr2));
//}
//模拟实现strncat 不会追加、0
//char* strncat(char* destination, const char* source, size_t num);
//char* my_strncpy(char* destination, const char* source, unsigned int number)
//{
// assert(destination && source);
// char* strat = destination;
// while(*strat)
// {
// strat++;
// }
// for (int i = 0; i < number; i++)
// {
// *strat = *source;
// }
// return destination;
//}
//int main()
//{
// char arr1[50] = "abcd";
// char arr2[] = "ef";
// printf("%s\n", my_strncpy(arr1, arr2,1));
//}
//int main()
//{
// char arr1[50] = "abcd";
// char arr2[] = "ef";
// strncat(arr1, arr2, 1);
//}
//模拟strncpy 不会复制、0
//char* strncpy(char* destination, const char* source, size_t num);
//char* my_strncpy(char* destination, const char* source, int number)
//{
// assert(destination && source);
// char* start = destination;
// int count = 1;
// while (*source )
// {
// *start = *source;
//
// if (count == number)
// return destination;
//
// count++;
// start++; source++;
// }
// return destination;
//}
//int main()
//{
// char arr1[] = "cbcd";
// char arr2[] = "abcd";
// printf("%s\n", my_strncpy(arr1, arr2, 3)); //abcd
//
//}
//模拟strncat 不会、0
//char* strncat(char* destination, const char* source, size_t num);
//char* my_strncat(char* destination, const char* source, unsigned int number)
//{
// assert(destination && source);
// char* start = destination;
// while (*start)
// {
// start++;
// }
// int count = 0;
// while (*source)
// {
// *start = *source;
// count++;
// if (count == number)
// {
// return destination;
// }
// start++; source++;
// }
// return destination;
//
//}
//int main()
//{
// char arr1[20] = "abcd";
// char arr2[] = "efghi";
// printf("%s\n", my_strncat(arr1, arr2, 3));
//}
//int main()
//{
// char arr1[20] = "abcd";
// char arr2[] = "efghi";
// strncat(arr1, arr2, 3);
//}
//模拟 strncmp
//int strncmp(const char* str1, const char* str2, size_t num);
//int my_strncmp(const char* str1, const char* str2, unsigned int number)
//{
// int count = 1;
// while (*str1 == *str2)
// {
// if (*str1 == '\0')
// {
// return 0;
// }
// str1++; str2++;
// count++;
// if (count == number)
// return 0;
// }
// return *str1 - *str2;
//}
//int main()
//{
// char arr1[] = "abcde";
// char arr2[] = "abcdr";
// printf("%d\n", my_strncmp(arr1, arr2, 4));
//}
//模拟strstr
//const char* strstr(const char* str1, const char* str2);
//char* strstr(char* str1, const char* str2); C语言只支持这个
//char* my_strstr(char* str1, const char* str2)
//{
// assert(str1 && str2);
// char* p = str1;
// char* a = NULL;
// char* b = NULL;
//
// while (*p)
// {
// a = p;
// b = str2;
// while (*a++ == *b)
// {
// b++;
// }
//
// if (*b == '\0')
// return (char* )p;
// if (*a == '\0')
// {
// return NULL;
// }
// p++;
// }
//}
//int main()
//{
// char arr1[] = "abcdabcdffff";
// char arr2[] = "dab";
// char* ret = my_strstr(arr1, arr2);
// if (ret)
// printf("找到了%s\n", ret);
// else
// printf("NO\n");
//}
其实只有strcpy会加上要拷贝字符串的\0,你发现了吗