目录
求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找 strstr strtok 错误信息报告 strerror 内存操作函数
C语言中对字符和字符串的处理很频繁,但是由于C语言本身是没有字符串类型, 字符串类型通常放在**常量字符串**或者**字符数组**中
函数介绍
求字符串长度
strlen
1. 字符串中存在‘\0'作为结束标志,strlen函数返回的是在字符串中'\0' 前面出现的字符个数(不包含'\0') 2.参数指向的字符串必须以'\0'作为结束标志 3.注意函数的返回值为size_t,是无符号的
strlen函数的模拟实现
#include<stdio.h> int main() { char arr[] = "hello crush"; int ret = my_strlen(arr); printf("%d\n", ret); return 0; }
方法1:计数器方式
size_t my_strlen(char* str) { int count = 0; while (*str) { count++; str++; } return count; }
方法2:不创建临时变量的计数器->递归
size_t my_strlen(char* str) { if (*str == '\0') { return 0; } else { return 1 + my_strlen(str + 1); } }
方法3:指针-指针
指针-指针计算结果是中间元素的个数
size_t my_strlen(char* str) { char* p = str; while (*str) { str++; } return str - p; }
长度不受限制的字符串函数
strcpy-字符串拷贝
1. 将源字符串复制到目标空间中(包含'\0') 2. 源字符串必须以'\0'作为结束标志 3. 目标空间必须足够大,以确保能存放源字符串 4. 目标空间必须足够大
模拟实现strcpy
#include<stdio.h> #include<assert.h> char* my_strcpy(char* dest, const char* src) { assert(dest && src); char* ret = dest; while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[] = "hello crush"; char arr2[20] = "xxxxxxxxxxxxxxxxx"; char* ret = my_strcpy(arr2, arr1); printf("%s\n", arr2); return 0; }
strcat-字符串追加
1. 将源字符串追加到目标字符串中,目标字符串中的终止字符被源字符串 的第一个字符覆盖。 2.源字符串必须以'\0'作为结束标志 3.目标空间必须足够大,能够容纳源字符串的内容 4.目标空间必须可修改
模拟实现strcat
1.找到目标字符串结尾的'\0' 2.拷贝—strcpy
#include<stdio.h> #include<assert.h> char* my_strcat(char* dest, const char* src) { assert(dest && src); char* ret = dest; //1.找到目标字符串结尾的'\0' while (*dest) { dest++; } //模拟strcpy函数 //2.拷贝—strcpy while (*dest++ = *src++) { ; } return ret; } int main() { char arr1[20] = "hello "; char arr2[] = "crush"; char* ret = my_strcat(arr1, arr2); printf("%s\n", arr1); return 0; }
strcmp-字符串比较
1.函数开始比较每个字符串的第一个字符,如果它们彼此相等, 则继续执行以下对,直到字符不同或到达终止空字符为止。 2.标准规定 第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字
模拟实现strcmp
#include<stdio.h> #include<assert.h> 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[] = "abcdef"; char arr2[] = "abcdef"; 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; }
长度受限制的字符串函数
strncpy-长度受限的字符串拷贝
1。从源字符串中拷贝num个字符到目标空间 2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标空间后面追加'\0',直到num个字符
代码演示
#include<stdio.h> int main() { char ch1[] = "hello"; char ch2[10] = "*********"; strncpy(ch2, ch1, 8); printf("%s\n", ch2); return 0; }
strncat-长度受限的字符串追加
1.将源字符串的第num个字符追加到目标空间中,再加上'\0'作为终止 2.如果源字符串的长度小于num,则只追加到包括'\0'的内容
#include<stdio.h> #include<string.h> int main() { char ch1[20] = "hello\0********"; char ch2[] = "crushabcdef"; strncat(ch1, ch2, 5); return 0; }
strncmp-长度受限的字符串比较
1.将字符串str1中最多num个字符与字符串str2中的最多num个字符进行比较。 2.开始比较每个字符串的第一个字符,如果它们彼此相等,它将继续执行以下对, 直到字符不同,直到到达终止空字符。或者直到num个字符在两个字符串中匹配(以先发生者为准)。
字符串查找
strstr
返回指向str2在str1中的第一次出现的指针, 如果str2不属于str1,则返回空指针
模拟实现strstr
#include<stdio.h> #include<assert.h> char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); //const修饰的变量一般不进行修改 //创建临时变量s1,s2 const char* s1 = str1; const char* s2 = str2; char* p = s1; while (*p) { s2 = str2; s1 = p; while (*s1 == *s2 && *s1 != '\0' && *s1 != '\0') { s1++; s2++; } if (*s2 == '\0') { return p; } p++; } return NULL; } int main() { char arr1[] = "abbcdef"; char arr2[] = "bcd"; char* ret = my_strstr(arr1, arr2); if (ret == NULL) { printf("字串不存在\n"); } else { printf("%s\n", ret); } return 0; }