文章目录
C语言笔记11:字符函数和字符串函数
一、字符分类函数
包含
ctype.h看一个字符分类函数的用法
c#include <ctype.h> #include <string.h> #include <stdio.h> int main() { char str[] = "No Please"; for(int i = 0;i < strlen(str);i++) { if(islower(str[i])) str[i] -= 32; } printf("%s\n",str); return 0; }其中的
islower就是一个字符分类函数,用来判断一个字符是不是小写字母。
函数 介绍 iscntrl 任何控制字符(一般用于移动光标,蜂鸣,删除字符等)比如\0,\r,\v,\n,127删除字符,27esc退出,\a响铃 isspace 任何空白字符:空格' ',换行'\n',回车'\r',制表符'\t',垂直制表符'\v' isdigit '0' ~ '9'字符 isxdigit 除了'0' ~ '9'还有一些十六进制字符'a' ~ 'f'或者'A' ~ 'F',x不是 islower 小写字母 isupper 大写字母 isalpha 大小写字母 ispunct 标点符号,不属于数字或者字母的可显示字符 isgraph 任何图形字符 isprint 图形字符+空白字符 附:
二、字符转换函数
包含
ctype.h
cint tolower(int c); int toupper(int c);
c#include <ctype.h> #include <string.h> #include <stdio.h> int main() { char str[] = "No Please"; for(int i = 0;i < strlen(str);i++) { if(islower(str[i])) str[i] = toupper(str[i]); } printf("%s\n",str); return 0; }
三、strlen使用和模拟
strlen使用:
c#include <string.h> #include <stdio.h> int main() { size_t len = strlen("how long?"); printf("%zd\n",len); return 0; }strlen模拟:
c#include <assert.h> size_t my_strlen(const char* str) { int count = 0; assert(str); while(*str) { count++; str++; } return count; }
c#include <assert.h> size_t my_strlen(const char* str) { assert(str); if(*str == '\0') return 0; return 1+my_strlen(str+1); }
c#include <assert.h> size_t my_strlen(const char* str) { assert(str); char* p = (char*)str; while(*p) { p++; } return p-str; }
四、strcpy的使用和模拟实现
strcpy模拟实现:
c#include <assert.h> char* my_strcpy(char* dest,const char* src) { char* ret = dest; assert(dest != NULL); assert(src != NULL); while((*dest++ = *src++))//先赋值,再有返回值,再判断 { ; } return ret; }
和
strcat一样都是右边赋值给左边返回初始地址空间。会拷贝
\0到目标空间
五、strcat的使用和模拟实现
strcat模拟实现
c#include <assert.h> char* my_strcat(char* dest,const char* src) { char* ret = dest; assert(dest && src); while(*dest) { dest++; } while((*dest++ = *src++)) { ; } return ret; }
会拷贝
\0到目标空间并将原来的\0修改。
strcat不能自己拼接自己,想要自己拼接自己,可以定义一个临时缓冲区
六、strcmp使用和模拟实现
strcmp模拟实现:
c#include <assert.h> int strcmp(const char* str1,const char* str2) { assert(str1 != NULL); assert(str2 != NULL); while(*str1 == *str2) { if(*str1 == '\0') return 0; str1++; str2++; } return *str1 - *str2; }
七、strncpy的使用
函数声明:
cchar* strncpy(char* destination ,const char* source ,size_t num);
strncpy不会 在末尾自动添加\0除非源字符串长度strlen小于num,strncpy不是strcpy的替代品
八、strncat的使用
函数声明:
cchar* strncat(char* destination ,const char* source ,size_t num);
strncat会 在末尾自动添加
\0
函数使用:
c#include <stdio.h> #include <string.h> int main() { char str1[20]; char str2[20]; strcpy(str1, "Be water,");//Be water, printf("%s\n", str1); strcpy(str2, "my friend Long");//my friend Long printf("%s\n", str2); strncat(str1, str2, 9);//Be water,my friend printf("%s\n", str1); return 0; }
九、strncmp的使用
函数声明:
cint strncmp(const char* str1,const char* str2,size_t num);
最多比较num个字符
遇到\0会停下来
十、strstr的使用和模拟实现
函数声明:
cchar* strstr(const char* str1,const char* str2);函数返回str2在str1中第一次出现的位置
使用:
c#include <string.h> #include <stdio.h> int main() { char str[] = "This is a simple string"; char* pch; pch = strstr(str,"simple"); strncpy(pch,"sample",6); printf("%s\n",str); return 0; }
strstr模拟实现:
cchar* strstr(const char* str1,const char* str2) { //一个外层循环p1,一个内层循环s1,s2 char* p1 = (char*)str1; char* s1,s2; assert(str1 != NULL); assert(str2 != NULL); if(*str2 == '\0') return ((char*)str1); while(*p1) { s1 = p1; s2 = (char*)str2; while((*s1 == *s2) && *s1 && *s2) s1++,s2++; //如果是到\0结束的 if(s2 == '\0') return cp; cp++; } return NULL; }
十一、strtok函数使用
函数声明:
cchar* strtok(char* str,const char* sep);
- 第一个参数是
char*表示这个参数是要被修改的,当函数找到一个sep出现的位置时,会把sep改成\0并返回开始找的位置- 第一个参数分为
NULL和非NULL两种情况,如果是非NULL就从头开始,并将函数内部的静态指针修改为下一次开始的位置,如果是NULL,就从静态指针位置开始找
函数使用:
cint main() { char addr[] = "196.168.0.1"; char* sep = "."; char* str = NULL; for(str = strtok(addr,sep); str != NULL ;str = strtok(NULL,sep)) { printf("%s\n",str); } return 0; }
运行结果:
十二、strerror函数的使用
cchar* strerror(int errnum);打印错误码对应的错误信息,这些信息一般存在
errno.h头文件里面
使用:
c#include <errno.h> #include <stdio.h> #include <string.h> int main() { for(int i = 0;i < 10;i++) { printf("%s\n",strerror(i)); } return 0; }
结果:
perror:perror("描述信息"),打印被设置的全局变量
errno的错误信息。描述信息:错误信息。




