1. 求字符串长度
1.1 strlen库函数
size_t strlen ( const char * str );
1.1.1 注意要点
- 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
含 ‘\0’ ) - 参数指向的字符串必须要以 ‘\0’ 结束。
- 注意函数的返回值为size_t,是无符号的
1.1.2 strlen模拟实现
#include <stdio.h> #include <assert.h> int my_strlen(const char* str) { assert(str); const char* start = str; const char* end = str; while (*end != '\0') { end++; } return end - start; } int main() { char arr[] = "abcdef"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }
2. 长度不受限制的字符串函数
2.1 strcpy库函数
char* strcpy(char * destination, const char * source );
2.1.1 主要要点
- 源头字符串必须以’\0’结束
- 会把源头字符串中的’\0’拷贝到目标空间中
- 目标空间必须足够大,以确保存放源字符串
- 目标空间必须可变
2.1.2 strcpy模拟实现
#include <stdio.h> #include <assert.h> char* my_strcpy(char* destenation, const char* source) { assert(destenation && source); char* ret = destenation; while (*destenation++ = *source++) { ; } return ret; } int main() { char arr1[] = "xxxxxxxxxxx"; char arr2[] = "hello"; printf("%s\n", my_strcpy(arr1, arr2)); return 0; }
2.2 strcat库函数
##3 2.2.1 注意要点
- 源头字符串必须以’\0’结束
- 目标空间必须足够大,能容纳源头字符串的内容
- 目标空间必须可修改
- strcat库函数自己给自己追加造成死循环
2.2.2 strcat模拟实现
- 源头字符串必须以’\0’结束
- 目标空间必须足够大,能容纳源头字符串的内容
- 目标空间必须可修改
- strcat库函数自己给自己追加造成死循环
2.2.2 strcat模拟实现
#include <stdio.h> #include <assert.h> char* my_strcat(char* destenation, const char* source) { char* record = destenation; while (*record != '\0') { record++; } while (*record++ = *source++) { ; } return destenation; } int main() { char arr1[20] = "math "; char arr2[] = "easy"; printf("%s\n",my_strcat(arr1, arr2)); return 0; }
2.3 strcmp库函数
int strcmp ( const char * str1, const char * str2 );
2.3.1 注意要点
- 第一个字符串大于第二个字符串返回大于0的数字;第一个字符串等于第二个字符串返回0;第一个字符串小于第二个字符串返回小于0的数字
- 从左到右一个一个字符依次比较,比较的是字符的ASCII值
2.3.2 strcmp模拟实现
#include <stdio.h> #include <assert.h> int my_strcmp(const char* s1, const char* s2) { assert(s1 && s2); while (*s1 == *s2) { if (*s1 == '\0') { return 0; } s1++; s2++; } return *s1 - *s2; } int main() { char arr1[] = "abcdef"; char arr2[] = "abd"; int ret = my_strcmp(arr1, arr2); if (ret > 0) { printf("arr1>arr2"); } else if (ret < 0) { printf("arr1<arr2"); } else { printf("arr1=arr2"); } return 0; }
3. 长度受限制的字符串函数
3.1 strncpy库函数
char * strncpy ( char * destination, const char * source, size_t num );
3.1.1 注意要点
- 拷贝num个字符从源头字符串到目标空间
- 如果源头字符串的长度小于num,则拷贝完源头字符串之后,在目标的后边追加’\0’,知道num个
3.1.2 strncpy模拟实现
#include <stdio.h> char* my_strncpy(char* dest,const char* source,size_t count) { char* start = dest; while (count && (*dest++ = *source++) != '\0') { count--; } if (count) { while (--count) { *dest++ = '\0'; } } return start; } int main() { char arr1[] = "xxxxxxxxxxx"; char arr2[] = "hello"; printf("%s\n", my_strncpy(arr1, arr2,3)); return 0; }
3.2 strncat库函数
char * strncat ( char * destination, const char * source, size_t num );
3.2.1 注意要点
- 可以实现自己给自己追加的情况,通常追加后后面加上一个’\0’来结束
- 目标空间必须足够大
- 目标空间必须可修改
3.2.2 strncat模拟实现
#include <stdio.h> char* my_strncat(char* front,const char* back,size_t count) { char* start = front; while (*front++) { ; } front--; while (count--) { if ((*front++ = *back++) == 0) { return start; } } *front = '\0'; return start; } int main() { char arr1[20] = "math "; char arr2[] = "easy"; printf("%s\n",my_strncat(arr1, arr2,3)); return 0; }
3.3 strncmp库函数
int strncmp ( const char * str1, const char * str2, size_t num );
3.3.1 注意要点
和strcmp需要注意的地方一样
3.3.2 strncmp模拟实现
#include <stdio.h> #include <assert.h> int my_strncmp(const char* str1, const char* str2, size_t num) { assert(str1 && str2); if (!num)return 0; while (--num && *str1 && (*str1 == *str2)) { str1++; str2++; } return *str1 - *str2; } int main() { char arr1[] = "adegcongdwg"; char arr2[] = "adegavd"; int ret = my_strncmp(arr1, arr2,5); if (ret > 0) { printf("arr1>arr2"); } else if (ret < 0) { printf("arr1<arr2"); } else { printf("arr1=arr2"); } return 0; }