目录
- 一.一个参数的字符函数
- 1.字符分类函数
- 2.字符转换函数
- 二.两个参数 长度不受限的字符串函数
- 1.strcpy函数
- 2.strcat函数
- 3.strcmp函数
- 三.三个参数 长度受限的字符串函数
- 1.strncpy函数
- 2.strncat函数
- 3.strncmp函数
- 四.其他字符串函数
- 1.strstr函数
- 2.strlen函数
- 3.strtok函数
- 4.strerror函数
一.一个参数的字符函数
1.字符分类函数
用于判断字符的类型,专门用于字符分类。
需包含头文件ctpye.h
例如:
isalpha:判断参数是否是字母
isdigit :判断参数是否是数字
符合条件返回真,不符合返回假。
2.字符转换函数
int tolower(int c);//将参数从大写转为小写 int touppper(int c);//将参数从小写转为大写用于转换大小写。
二.两个参数 长度不受限的字符串函数
1.strcpy函数
char* strcpy(char* destination,const char* source); char arr1[] = "abc"; char arr2[10] = {0}; strcpy(arr2,arr1);strcpy用于拷贝字符串,将 arr1(source) 的字符串拷入 arr2(destination)。
注意:
源字符串必须以 ‘\0’ 结尾。
会将源字符串的 ‘\0’ 拷入目标空间。
目标空间必须足够大 确保能放入拷贝的字符串。
目标空间必须可修改。
const char* destination;//error 目标空间此时不能修改 char* p = "abcd";//error 常量字符串不能被修改 p为指针 指向首字符的地址 char* p[10] = "abcd";//此时 p为数组名 数组中存放字符串 可修改模拟实现:
char*my_strcpy(char*dest,constchar*src){assert(dest&&src);//确保两个指针非空char*res=dest;while(*dest++=*src++)//后++先用再加{//通过赋值拷贝数据 将'\0'赋值给dest后表达式为 0,while终止循环;//空语句}returnres;//返回目标空间的起始地址}2.strcat函数
和strcpy函数很像,strcpy从开头覆盖到’\0’结束,strcat从结尾’\0’开始覆盖 直到整个源字符串追加完成。
strcpy 是替换,strcat 是追加。
注意:
源字符串必须以 ‘\0’ 结尾。
从目标字符串的 ‘\0’ 开始追加 ‘\0’被覆盖,将源字符串整体拷入包括’\0’。
目标空间必须足够大 确保能放入源字符串。
目标空间必须可修改。
模拟实现:
char*my_strcat(char*dest,constchar*src){assert(dest&&src);//确保两个指针非空char*res=dest;while(*dest)//找到'\0' 不用再加了{dest++;}while(*dest++=*src++)//dest从'\0'开始 通过赋值拷贝数据{;//空语句}returnres;//返回目标空间的起始地址}strcat函数的模拟实现 相比 strcpy 只多了一个找’\0’的while循环。
3.strcmp函数
用于比较两个字符的大小。
int strcmp(const char* str1, const char* str2); int res = strcmp("abc","abcd");//<0从左到右比较字符的ASCII码大小,字符相同则比较下一个字符,直到得出结果,ASCII码值小 则小,返回值小于0,ASCII码值大,返回值大于0。如果完全相同返回 0。'\0’也参与比较 其ASCII码值为 0。
if("abc" < "abcd")//error ...直接让两个字符比较,比较的是两个字符串首字符的地址 而不是字符串的内容。
模拟实现:
intmy_strcmp(constchar*str1,constchar*str2){assert(str1&&str2);while(*str1==*str2){if(*str1=='\0')//两个字符串均为'\0'return0;//相等str1++;str2++;}return*str1-*str2;//如果str1>str2 返回值>0//如果str1<str2 返回值<0}三.三个参数 长度受限的字符串函数
1.strncpy函数
char arr1[] = "abc"; char arr2[10] = "xxxxxxx"; //strcpy(arr2,arr1);abc\0xxx //strncpy(arr2,arr1,3);abcxxxx (只覆盖前3位 没有'\0') strncpy(arr2,arr1,5);//abc\0\0xx (位数不够补'\0')可以自行决定拷贝的个数。
2.strncat函数
char arr1[] = "abc"; char arr2[10] = "qq\0xxxxxxx"; strncat(arr2,arr1,2);//qqab\0xxxxxxx可以自行决定追加的个数。覆盖’\0’,追加完成后再加回一个’\0’。
3.strncmp函数
char str1[] = "abc"; char str2[] = "abe"; strncmp(str1, str2, 2);//0 相等可以自行决定比较的字符数。
四.其他字符串函数
1.strstr函数
string string 在字符串中找字符串(子字符串)。
char* strstr(const char* str1, const char* str2);在str1中找str2是否存在,如果存在 返回str1中 str2首字符出现的地址,找不到则返回NULL。
模拟实现:
constchar*my_strstr(constchar*str1,constchar*str2){constchar*s1=NULL;constchar*s2=NULL;constchar*cur=str1;while(*cur){s1=cur;s2=str2;while(*s1==*s2&&*s1!='\0'&&*s2!='\0')//找到字符 且未结束{s1++;s2++;}if(*s2=='\0')//str2已被找到returncur;//返回起始地址cur++;//如果 *s1=='\0'大循环结束,*s2=='\0' 已找到//*s1!=*s2 未找到,cur+1 继续找 直到找到或者找不到}}2.strlen函数
size_t strlen(const char*str);用于获取字符串的长度。
检测 ‘\0’ 前的字符个数。
注意:
参数指向的字符串必须包含 ‘\0’ 。
需包含头文件 <string.h> 。
返回值类型为 size_t (无符号)。
if(strlen("ab")-strlen("abcd")>0)printf("1");elseprintf("0");表面看 2 - 4 = -2,打印结果应为 0,但实际打印结果为 1。因为该函数的返回值类型为 size_t 无符号,-2的补码会被当做一个非常大的正数输出,因此打印 1。
3.strtok函数
char* strtok(char*str, const char* sep);因为字符串内容会被strtok函数改变,字符串一般都是副本 且可以修改。
char str[] = "abc@cde.qwe"; char temp[20] = {0}; strcpy(temp, str);sep指向一个字符串,这个字符串是分割符(字符)的集合。
str指向的字符串 包含sep指向的字符串中的分隔符,这个分隔符记为标记。
const char* sep = "@.";//两个分隔符(标记)'@' 和 '.'strtok函数会找到这个标记,将其变为’\0’,并返回指向这个标记的指针。
char* p = strtok(temp, sep);//返回第一个标记的地址 赋给p p = strtok(NULL,sep);//查找下一个标记如果 str != NULL ,函数将找到字符串的第一个标记,并保存它的位置(地址)。
如果 str == NULL,函数将从被保存的位置开始,查找下一个标记。
如果标记被找完,返回NULL。
也可以如下编写程序:
char* p = NULL;//定义一个指针并置于NULL 防止野指针出现 for(p = strtok(temp, sep); p!=NULL; p = strtok(NULL, sep)) { printf("%s ",p);//打印结果 } //"abc\0cde\0qwe"strtok函数从被保存位置开始找下一个标记,运用了static。
4.strerror函数
在C语言中,库函数调用失败会记录错误码,错误码存放在全局变量errno中。
在头文件 errno.h 中有说明。
char* strerror(int errnum);函数可以把参数部分错误码 对应的字符串信息的地址返回来。
每一个数字(错误码)对应了一条错误信息,这个信息也是字符串,具有地址。
没有错误时 errno为 0,有错误时 errno存放错误相关的错误码,使用strerror函数将具体的错误信息地址带回 用printf函数打印展现。
char* p = strerror(1); printf("%s", p); perror("hello");// hello: ...(错误信息)perror 相当于 printf + strerror,自定义信息:xxxxx(错误信息)。