目录
1.字符分类函数
有一系列函数是做字符分类的,放在ctype.h头文件中
举例:
int islower(int c); islower(c); 在这里,islower是确定参数部分是否是小写字母,如果是,则返回真 不是,则返回假
2.字符转换函数
当我们想要转换大小字母,可以用以下方法 char c='A'; c+=32; 因为英文大小写的ASCLL码是相差32,所以大小写可以用32来转换
但c语言中本身就有转换大小写的字符函数
int tolower(int c);将参数部分变成大写 int toupper(int c);将参数部分变成小写 tolower(c); toupper(c);
3.srlen的使用和模拟
3.1使用
size_t strlen(const char*str); 这里strlen返回的类型是size_t,也就是无符号整数类型 参数部分是字符指针 计算的是\0出现前的字符个数,字符指针指向的字符串必须以\0结束 举例: strlen("len")-strlen("gggggg") 这里因为size_t是无符号整数,所以两者相减的结果也是无符号整数,虽然是负数,但这里也被识别为大于0
3.2模拟
模拟1 int strlen1(const char* str)//这里参数接受的字符指针,对应指针存的是字符串首字符的地址 { int count = 0; assert(str);//检查是否有问题 while (*str)//这里之所以这么写条件,是因为当str不停的加,加的是地址,那么加到\0字符的地址的时候,\0等于0,所以while循坏会结束 { count++;//每加一个地址,就计数一次,直到地址对应到了\0 str++; } return count; }
int strlen2(const char* str) { assert(str); if (*str == '\0')//这里是直接判断当前指针str对应的字符是不是\0 如果是,则直接返回0 { return 0; } else { return 1 + strlen2(str + 1);//这里是通过递归,只要不是\0,就+1,然后继续执行一次函数 直到遇到\0,由于\0也只会返回0,所以最后的返回的值就是字符的个数 } }
模拟3 int strlen3(char* s) { assert(s); char* p = s;//将s存储的地址赋给新的字符指针p while (*p != '\0')//这里当*p=='\0'的时候,就不会继续执行 { p++; } return p - s;//这样p对应的地址就是\0,s对应的地址是字符串首字符地址 所以相减,就是对应的字符数量 }
4.strcpy的使用和模拟
4.1使用
char*strpy(char * destination,const char*source); 字符串必须以\0结束 \0也会被拷贝到目标空间也就是destination指针指向的字符串 目标空间必须足够大,能存放source指针指向的字符串 目标空间必须可以改变
4.2模拟
char* strcpy1(char* dest, const char* src) { char* ret = dest; assert(dest != NULL); assert(src != NULL); while ((*dest++ = *src++))//这里就是让源字符串的内容赋值给目标字符串 但由于这里*dest如果遇到了\0之后,也就是结尾符会停止循环 { ; } return ret; }
5.strcat的使用和模拟
5.1使用
char*strcat(char * destination,const char*source); 字符串以\0结束 目标字符串必须有\0 目标空间必须足够大,且可以改变 如果自己给自己追加,会死循环
5.2模拟
char* strcat1(char* dest, char* src) { char* ret = dest;用来返回内容 assert(dest != NULL);简单的报错 assert(src != NULL); while (*dest)//先进行while,让dest指针指向字符串的结尾符 { dest++; } while (*dest++ = *src++);//从结尾符开始,将源字符串的内容赋值进去,直到把原字符串的\0也赋值进去,然后while就会判断*dest是\0,则循坏结束 return ret; }
6.strcmp的使用和模拟
6.1使用
int strcmp ( const char * str1, const char * str2 ); 第一个字符串大于第二个字符串,则返回大于0的数字 第一个字符串等于第二个字符串,则返回0 第一个字符串小于第二个字符串,则返回小于0的数字
6.2模拟
int strcmp1(const char* str1, const char* str2) { int ret = 0; assert(str1 != NULL); assert(str2 != NULL); while (*str1 == *str2)//如果对应位置的两个字符相等,则继续执行循坏 { if (*str1 == '\0')如果字符等于\0,说明到了结尾,且一直想等,所以直接返回0 { return 0; } str1++;让str1不停的增长,下同理 str2++; } return *str1 - *str2;假如不相等,那么就用ASCLL码进行判断,直接字符相减,从而返回大于0或小于0的值 }
7.strncpy函数
char *strncpy(char *destination,const char*source,size_t num); 拷贝num个字符从原字符串到目标空间 如果源字符串长度小于num(包含\0),则拷贝完字符串后,在目标字符串后面继续增加0,直到num个
8.strncat函数
char *strncat(char *dest, const char *src, size_t n) 将src的前n个字符追加到目标dest里,最后再加一个\0 如果源中的字符串长度小于n,则只有\0之前的内容,当然\0也会追加过去,为了保证字符串合法。 但是不会在\0前加0从而填补空缺.
9.strncmp函数
int strncmp(const char *str1,const char*str2.size_t num); 比较str1和str2的前num个字符,如果相等继续往后比较,最多比较num个字母,如果提前发现不一样,就提前结束,根据ASCLL码比较大小,如果直到num个字符都相等,那就返回0
10.strstr使用和模拟
10.1使用
char * strstr(const char*,const char*); 找到第一个字符串中出现第二个字符串的位置,返回这个位置的地址,类型是char * 如果没找到,返回空指针 查找的时候不包含\0,但遇到\0就结束了 #include <stdio.h> #include <string.h> int main () { char str[] ="This is a simple string"; char * pch; pch = strstr (str,"simple");//两者类型都是char *,所以可以直接赋值 strncpy (pch,"sample",6);//这样就会输出跟最开始一模一样的字符串 printf("%s\n", str); return 0; }
10.2模拟
char* strstr1(const char* str1, const char* str2) { char* cp = (char*)str1; //将第一个字符串的地址给予cp指针 char* s1, * s2;//待会要用 if (!*str2) //如果str2这个指针指向的是\0,通过!变成真,满足条件,直接返回第一个字符串的指针 { return ((char*)str1); } while (*cp)//直到cp指针指向\0前 { s1 = cp; //假设cp是第一个字符串中相等的位置,s1是用来下面增长的,否则不好返回 s2 = (char*)str2; //s2是用来简化代码长度的 while (*s1 && *s2 && !(*s1 - *s2)) //假如两个字符相等,那么会满足while循坏条件,直到不相等 { s1++; s2++; } if (!*s2) //如果上面的循坏结束后,*s2变成了\0,说明找到了, //这里加!,让\0变成真,从而执行下面的语句 { return (cp); //因为找到了,所以直接把cp的地址传递回去,这里cp就是第一个相等的地址 } cp++; //假如上面的if条件没有达成,说明cp指向的不是相等, //或者说第二个字符串的一部分跟第一个字符串相等, //所以还得继续加cp,直到能执行if语句,或者cp指向了\0 } return(NULL);//如果cp循坏到了\0,说明第二个字符串在第一个字符串里没有找到, //所以直接返回空指针 }
11.strtok函数的使用
char * strtok(char *str,const char*sep); sep是指向一个字符串,定义了用作分隔符的字符集合 第一个参数指定一个字符串,它包含了0个或者多个sep字符串中一个或者多个分隔符 分割的标记 就是一个sep字符串中可能不是一个字符,有多个字符, 函数只要在str看到其中一个字符,就会认为是一个标记。 strtok会找到标记,然后将标记也就是str字符串中sep字符串的内容变成\0, 并将\0前的内容的首字符的指针返回 由于strtok函数会将标记改成\0,所以str字符串需要可改变 strtok函数的str字符串如果是非NULL,会找到str中的第一个标记,且保存它的位置 如果是NULL,则在这个位置的基础上继续找标记,保存位置,修改, 如果还有一条strtok语句,则会继续查找这个位置之后的标记 如果找不到了,就会返回一个空指针,即NULL #include<stdio.h> #include<string.h> int main() { char arr[] = "192.168.6.1"; char* sep = "."; char* str = NULL; for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)) 初始先给第一个参数,记录第一个位置,后面可以用NULL作参数, 从而不停的找后面的标记 { printf("%s\n", str); } return 0; }
12. strerror函数的使用
char * strerror(int errnum); 打印错误信息。不同系统和c语言标准库的实现中都规定了一些错误码, 放在errno.h头文件中,当c语言程序启动, 则会使用一个errno的全局变量来记录当前程序的错误码, 默认是0,没有错误,当出现错误之后,会改变, 但因为是整数,不知道是什么意思,所以可以用这个函数来将整数对应的错误信息的字符串地址返回 #include<errno.h> #include<string.h> #include<stdio.h> int main() { int i = 0; for (i = 0; i < 10; i++) { printf("%s\n", strerror(i));//打印对应整数的错误信息 } return 0; }
第一个是没有错误
第二个是操作被拒绝
第3个是没有这个文件或文件夹
第4个是没有这个进程
第5个函数调用被中断了
第6个输入输出错误
第7个没有这个设备或者地址
第8个参数太多了
13.perror函数
perror("ww"); 最后输出的时候,直接输出ww : error变量对应的错误信息