size_t strlen(const char* str)求字符串长度
#include <stdio.h> #include <assert.h>
int my_strlen(const char* str) { int count = 0; assert(str != NULL); while (*str != '\0') { count++; str++; } return count; } int main() { char arr[] = "abc"; int len = my_strlen(arr); printf("%d", len); return 0; }
|
- 字符串已经以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’)。–{‘a’,’b’}不可以
- 参数指向的字符串必须要以’\0’结束
- 函数的返回值是size_t,是无符号的
char* strcpy(char* destination, const char* source)拷贝字符串
#include <stdio.h> #include <string.h> #include <assert.h>
char* my_strcpy(char* str1,const char* str2) { int i = 0; while (*str2 != '\0') { *(str1 + i) = *str2; str2++; i++; } *(str1 + i) = '\0'; return str1;
} int main() { char arr[20] = { 0 }; char* p = "hello"; my_strcpy(arr, p); puts(arr); return 0; }
|
- 源字符串必须要以’\0’结束
- 会将源字符串中的’\0’拷贝到目标空间
- 目标空间必须足够大,以确保能存放源字符串
- 目标空间必须可变(不可以是char* str = “#####”)
char* strcat(char* destination, const char* source)字符串追加
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h> void* my_strcat(char* dest, const char* src) { assert(dest && src); while (*dest) { dest++; } while (*dest++ = *src++) { ; } } int main() { char arr[20] = "hello "; char arr2[] = "world!"; my_strcat(arr,"world!"); puts(arr); return 0; }
|
- 源字符串必须以’\0’结束
- 目标空间必须足够大。
- 目标空间必须可以修改
- 但不能自己给自己追加
int strcmp(const char* str1, const char* str2)
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h> int my_strcmp(const char* str1, const char* str2) { assert(str1); assert(str2); while (*str1 == *str2) { if (*str1 == '\0' || *str2 == '\0') { break; }
str1++; str2++; } return *str1 - *str2; }
int main() { char* p = "obcb"; char* q = "obca"; int ret = my_strcmp(p, q); printf("%d", ret); return 0; }
|
- 第一个字符串大于第二个字符串,则返回大于0得数字
- 等于,则返回0
- 小于,则返回小于0的数字
strcpy strcat strcmp 长度不受限制的字符串函数
strncpy strncay strncmp 长度受限制的字符串,可以控制参与变化的字符串中的字符个数
char * strstr ( char * str1, const char * str2 );
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h>
char* my_strstr(const char* str1, const char* str2) { assert(str1 && str2); const char* s1 = NULL; const char* s2 = NULL; const char* cp = str1; if (*str2 == '\0') { return (char*)str1; }
while (*cp) { s1 = cp; s2 = str2; while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') { return (char*)cp; } cp++; } return NULL;
}
int main() { char arr1[] = "abcdefabcdef"; char arr2[] = "bcd"; char* ret = my_strstr(arr1, arr2); if (ret == NULL) { printf("没找到\n"); } else { printf("找到了:%s\n", ret); }
return 0; }
|
char * strtok ( char * str, const char * delimiters );字符串切割函数
#include <stdio.h> #include <string.h> #include <assert.h>
int main() { char arr1[] = "123@bcda.com"; char* p = "@."; char tmp[20] = { 0 }; char* ret = NULL; for (ret = strtok(arr1, p); ret != NULL;ret=strtok(NULL,p)) { puts(ret); } return 0; }
|
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了0个或者多个又sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是用临时拷贝的内容并且可修改。)
- strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,朝朝下一个标记。
- 如果字符串中不存在更多的标记,则返回NULL指针
char* strerror(int errnum)返回错误码,所对应的错误信息
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <errno.h>
int main() { printf("%s\n", strerror(0)); printf("%s\n", strerror(1)); printf("%s\n", strerror(2)); printf("%s\n", strerror(3)); printf("%s\n", strerror(4)); return 0; }
|

用法
比如在打开不存在的文件时,会报错,错误码会记录信息,可以通过这个函数打印出信息,errno是c语言定义好的全局变量,用的时候要包含头文件errno.h
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <errno.h>
int main() { FILE* pf = fopen("aszxc.txt", "r"); if (pf == NULL) { printf("%s\n", strerror(errno)); return 1; } fclose(pf); pf = NULL; return 0; }
|

perror(char* str)直接打印错误信息
- 首先把错误码转化为错误信息
- 打印错误信息(包含了自定义的信息)
str自定义信息