一、前言
字符串就是首字符的地址
char *ptr = "hello world";//保存在数据段的or段,改数据不能被修改(常量字符串,不能被修改) char src[100] = "hello world";//保存在栈 char *str = (char *) malloc(sizeof(char) * 100);//保存在堆 strcpy(str,"hello world");
二、字符串函数
2.1 strlen字符串长度函数
char *ptr = "hello world";
char src[100] = "hello world"; char *str = (char *) malloc(sizeof(char) * 100); if(NULL == str) { printf("malloc error!"); exit(1); } size_t len = strlen(src);//返回是长整型 printf("%ld",len); //实现 size_t my_strlen(const char *s) { size_t len = 0; whlie(*s != '\0') { len++; s++; } return len; }
2.2 strcpy、strncpy字符串拷贝函数
char src[100] = "hello world"; char *dest = (char *) malloc(sizeof(char) * 100); if(NULL == dest) { printf("malloc error!\n"); exit(1); } char *temp = strcpy(dest,src);//返回dest的首字符地址 //存在风险,无法确定dest是否大于src。 //微软推荐strcpy_s(char *dest,int len,char *src)len就是dest的长度 if(NULL == temp)//相对于my_strcpy而言 { printf("my strcpy is error!\n"); exit(1); } //实现my_strcpy char *my_strcpy(char *dest,char *src) { if(NULL == dest || NULL == src) { return NULL; } char *temp = dest;//需要有个temp进行移动 whlie(*src != '\0') { *temp = *src; src++; temp++; } *dest = '\0'; return dest; } //my_str_strncpy char *my_strncpy(char *dest,char *src,size_t n) { if(NULL == dest || NULL == src) { return NULL; } int i; char *temp = dest; for(i = 0; (i < n) && (*src != '\0'); i++) { *temp = *src src++; temp++; } for(;i < n;i++) { *temp = '\0'; temp++; } return dest; }
2.3 strcat、strncat字符串链接函数
dest还是有风险
//实现my_strcat char *my_strcat(char *dest,char *src) { if(NULL == dest || NULL == src) { return NULL; } char *temp = dest; while(*temp != '\0') { temp++; } while(*src != '\0') { *temp = *src; temp++; src++; } *temp = '\0'; return dest; } //实现my_strcat char *my_strncat(char *dest,char *src,size_t n) { if(NULL == dest || NULL == src) { return NULL; } char *temp = dest; while(*temp != '\0') { temp++; } for(int i = 0; (i < n) && (*src != '\0'); i++) { *temp = *src; temp++; src++; } *temp = '\0'; return dest; }
2.4 strcmp、strncmp字符串比较函数
//实现 int my_strcmp(char *s1,char *s2) { if(NULL == s1 && NULL != s2) { return -1; } if(NULL != s1 && NULL == s2) { return 1; } if(NULL == s1 && NULL == s2) { return 0; } while(*s1 != '\0' &&) { if(*s1 > *s2) { return 1; } if(*s1 < *s2) { return 0; } s1++; s2++; } if(*s1 == '\0' && *s2 == '\0') { return 0; } if(*s1 != '\0' && *s2 == '\0') { return 1; } if(*s1 == '\0' && *s2 != '\0') { return -1; } return 0; }
//实现strncmp int my_strncmp(char *s1,char *s2,size_n) { if(NULL == s1 || s2 == NULL) { return -1; } for(int i = 0; (i < n) && ((s1[i] != '\0') && (s2 != '\0')); i++) { if(s1[i] != s2[i]) { return -1; } } return 0; }
2.5 strchr、strrchr、strpbrk字符串函数
stecasecmp 忽略大小写比较字符串
strchr 查找字符串中第一个出现的指定字符
strrchr 查找字符串中最后一个出现的指定字符
strpbrk 查找字符串中第一个出现的指定字符
补充
strspn
返回字符串中连续不含指定字符串内容的字符数
统计s1中任意一个字符不在s2中出现的字符小标
字典
strstr
在一字符串查找指定的字符串
strtok
分割字符串
strcpy //不安全,容易越界访问,只支持字符串拷贝,不支持其他类型
memcpy 拷贝任意类型
memset 清零
bzero 清空
atoi 字符串变整型数字
编程练习
题目:在字符串中寻找特定字符串
题目:实现strtok