#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<errno.h>
//求字符串长度 strlen
//长度不受限制的字符串函数 strcpy strcat strcmp
//长度受限制的字符串函数 strncpy strncat strncmp
/*strlen实现三种方法*/
//1.计数器方法
//2.递归
//3.指针-指针
//int my_strlen(const char* str)
//{
// int count = 0;
// assert(str != NULL);
// while (*str != '\0')//while(*str)
// {
// count++;
// str++;
// }
// return count;
//}
//int main()
//{
// //int len = my_strlen("abcdef");//拿到a的地址,到\0停止
// char arr[] = { 'a','b','c','d','e','f' };
// int len = strlen(arr);//随机值,因为\0在随机位置
// //printf("%d\n", len);
//
// //输出hehe,因为strlen定义的是无符号数 负数会被转为换为整数
// if (strlen("abc") - strlen("abcdef") > 0)
// {
// printf("hehe\n");
// }
// else
// {
// printf("haha\n");
// }
// return 0;
//}
/*strcpy字符串拷贝*/
//char* my_strcpy(char* dest, const char* src)
//{
// //保证指针有效性
// assert(dest != NULL);
// assert(src != NULL);
// char* ret = dest;
// //拷贝src指向的字符串到dest指向的空间,包含'\0'
// while (*dest++ = *src++)
// {
// ;
// }
// //返回目的空间的起止地址
// return ret;
//}
//int main()
//{
// char arr1[] = "abcdefghi";
// char arr2[] = "bit";
// //错误示范 char arr2[] = {'b','i'.'t'};
// //错误示范 char *arr1[] = "abcdefghi"; //指针不能指向常量字符串
// //strcpy(arr1,arr2);//(目的,源头) \0也会带过去,但后面依旧存在
// char* arr = my_strcpy(arr1, arr2);
// printf("%s\n", arr);
// return 0;
//}
/*
strcat字符串追加
源字符串必须以'\0'结束
目标空间必须足够大
目标空间必须可修改
*/
//char* my_strcat(char* dest,const char* src)
//{
// assert(dest != NULL && src!= NULL);
// char* ret = dest;
// //1.找到目的地字符串的\0
// while (*dest != '\0')
// {
// dest++;
// }
// //2.追加
// while (*dest++ = *src++)
// {
// ;
// }
// return ret;
//}
//int main()
//{
// /*
// //崩溃,空间不够大
// char arr1[] = "hello";
// char arr2[] = "world";
// strcat(arr1, arr2);
// printf("%s\n", arr1);
// */
// //从\0开始追加,\0也会追加过去
// char arr1[30] = "hello";
// char arr2[] = "world";
// /*strcat(arr1, arr2);*/
// char* arr = my_strcat(arr1,arr2);
// printf("%s\n", arr);
//
// return 0;
//}
/*
strcmp字符串比较
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
*/
//int my_strcmp(char* str1,char* str2)
//{
// assert(str1 && str2);
// //比较
// while(*str1 == *str2)
// {
// if (*str1 == '\0')
// return 0;
// str1++;
// str2++;
// }
// if (*str1 > *str2)
// return 1;
// else
// return -1;
//
// //return *str1 - *str2;
//}
//int main()
//{
// char* p1 = "abc";
// char* p2 = "abcdef";
// /*int ret = strcmp(p1, p2);*/
// int ret = my_strcmp(p1, p2);
// printf("%d\n", ret);
// return 0;
//}
/*
strncpy
拷贝num个字符从源字符串到目标空间
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后面追加0,知道num个
*/
//char* my_strncpy(char* dest, const char* src, int num)
//{
// assert(dest && src);
// char* start = dest;
// int len_src = strlen(src);
// int ret = dest;
// while (num && (*dest++ = *src++))
// {
// num--;
// }
// if (num)
// {
// while (--num)
// {
// *dest++ = '\0';
// }
// }
// return (start);
//}
//int main()
//{
// char arr1[10] = "abc";
// char arr2[] = "hello bit";
// /*strncpy(arr1, arr2, 4);*/
// my_strncpy(arr1, arr2, 6);
// printf("%s\n", arr1);
// return 0;
//}
/*
strncat
*/
//char* my_strncat(char* dest, char* src, size_t num)
//{
// assert(dest && src);
// char* start = dest;
// //1.找到目的字符串的\0
// while (*dest++ != '\0')
// ;
// //2.追加
// while(num--)
// {
// if (!(*dest++ = *src++))
// return (start);
// }
// *dest = '\0';
// return (start);
//}
//int main()
//{
// char arr1[30] = "hello";
// char arr2[] = "world";
// /*strncat(arr1, arr2, 3);*/
// my_strncat(arr1, arr2, 3);
// printf("%s\n", arr1);
// return 0;
//}
/*
strcncmp
*/
//int main()
//{
// const char* p1 = "abcdef";
// char* p2 = "abcdqwer";
// int ret = strncmp(p1, p2, 3);
// printf("%d\n",ret);
// return 0;
//}
/*
strstr - 查找字符串
*/
//char* my_strstr(const char* p1, const char* p2)
//{
// assert(p1 && p2);
// char* s1 = p1;
// char* s2 = p2;
// char* cur = p1;
// if (p2 == '\n')
// return p1;
// while (*p1++)
// {
// s1 = cur;
// s2 = p2;
// while ((*s1 != '\0') && (*s2!='\0') && (*s1 == *s2))
// {
// s1++;
// s2++;
// }
// if (*s2 == '\0')
// return cur;
// cur++;
// }
// return NULL;
//}
//int main()
//{
// char* p1 = "abbbcdefabcdef";
// char* p2 = "bbc";
// /*char* ret = strstr(p1,p2);*/
// char* ret = my_strstr(p1, p2);
// if (ret == NULL)
// printf("子串不存在\n");
// else
// printf("%s\n",ret);
// return 0;
//}
/*
strtok
*/
//int main()
//{
// char arr[] = "zpw@bitedu.tech";
// char* p = "@.";
// char buf[1024] = { 0 };
// strcpy(buf,arr);
// //切割buff中的字符串
//
// char* ret = NULL;
// for (ret = strtok(arr,p);ret!=NULL;ret = strtok(NULL, p))
// {
// printf("%s\n", ret);
// }
//
// //char* ret = strtok(arr, p);
// //printf("%s\n", ret);
// //ret = strtok(NULL,p);
// //printf("%s\n", ret);
// //ret = strtok(NULL, p);
// //printf("%s\n", ret);
// return 0;
//}
/*
strerror
*/
//int main()
//{
// //错误码 错误信息
// //0 - No error
// //1 - Operation not permitted
// //2 - No such file or directory
// //......
// //errno是一个全局的错误码变量
// //当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,复制到error中
// char* str = strerror(errno);
// printf("%s\n", str);
//
// return 0;
//}
//字符分类函数
//字符转换函数 tolower toupper
【C语言】部分字符串函数的使用和实现
最新推荐文章于 2024-05-23 00:22:50 发布