摘要:模拟实现string.h中的一些库函数,主要包括:strlen,strcpy,strcmp,strcat,strstr以及strtok,strerror,字符分类函数等介绍
具体的官方函数可参考网址:https://cplusplus.com/
目录
具体的官方函数可参考网址:https://cplusplus.com/
1.模拟实现strlen:计算字符串长度
有三种方法:
1.1.使用count计数器
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
1.2.使用两个指针start,end
int my_strlen(const char* str)
{
assert(str);
char* start = str;
char* end = str;
while (*end)
{
end++;
}
return end - start; //两个指针相减为之间的字符个数
}
1.3.递归的方法
int my_strlen(char* str)
{
if (*str == '\0')
{
return 0;
}
else
return 1 + my_strlen(str+1);
}
2.模拟实现strcpy:将字符串2的地址拷贝到字符串1的地址,返回1的地址
- src必须以'\0'结束
- 会将src中的'\0'拷贝到dest
- dest必须足够大,能够放入src
- dest必须可变,不要使用常量字符串
代码的模拟实现:
char* my_strcpy(char* dest, const char* src)
{
assert(dest); //保证指针的有效性
assert(src);
char* tmp = dest;
while (*dest++ = *src++)
{
;
}
return tmp;
}
3.模拟实现strcmp:比较两个字符串的大小,规定:
- str1大于str2,返回>0
- str1等于str2,返回0
- str1小于str2,返回<0
判断两个字符串是否相等:单个字节的ascii码进行比较
int my_strcmp(const char* str1,const char* str2)
{
//先判断两个指针的有效性
assert(*str1);
assert(*str2);
//两个相等,指针向后移动,直到不相等,返回*str1-*str2
//两个相等,判断一个是否到\0,则两个全等,返回0
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
//单个字节比较
/*if (*str1 > *str2)
{
return *str1 - *str2;
}
else
{
return *str1 - *str2;
}*/
return *str1 - *str2;
}
4.模拟实现strcat:在dest后面拼接src,返回拼接后的dest
char * strcat ( char * destination, const char * source );
模拟实现思路:首先找到dest的\0,然后再拼接
- 源字符串必须以\0结束
- dest空间必须足够大,能容纳src中的字符
- dest必须可以修改
char* my_strcat(char * dest,char * src)
{
char* cur = dest;
//先让cur指针找到dest的\0位置
while (*cur)
{
cur++;
}
//拷贝源头数据到\0之后的空间
while (*cur++ = *src++)
{
;
}
return dest;
}
5.模拟实现strstr:在str1中寻找str2是否存在,如果存在返回str2的地址,不存在返回NULL
char *
strstr
(
const
char *
str1
,
const
char *
str2
);
模拟实现思路:使用两个指针s1,s2分别指向str1,str2;此时需要一个指针p来记录str2在str1中找到的位置,即找到之后返回p的地址;首先:将p指向str1,比较*s1与*s2,如果相等,s1++,s2++,此时p不动;如果不相等,则p++,s1跟着p++,循环这个步骤,直到遍历完str1
char* my_strstr(const char * str1,const char * str2)
{
//先对两个指针断言
assert(*str1);
assert(*str2);
//三个指针
char * s1 = str1;
char * s2 = str2;
char * p = str1;
while(*p)
{
s1 = p;
while(*s1!='\0' && *s2!='\0' && (*s1 == *s2))
{
s1++;
s2++;
}
//s2遍历结束,则找到了
if(*s2 =='\0')
return (char *)p;
p++;
}
//*p走到尽头,即str1遍历结束,表示没找到
return NULL;
}
6.strtok
char *
strtok
(
char *
str
,
const
char *
sep
);
- sep参数是个字符串,定义了用作分隔符的字符集合
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
- 使用指南:
/* strtok example */ int main() { char *p = "www@sust.com"; const char* sep = ".@"; char arr[30]; char *str = NULL; strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容 for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep)) { printf("%s\n", str); //www //sust //com } }
7.strerror
char *
strerror
(
int
errnum
);
返回错误码对应的信息,使用的时候 必须包含errno.h
使用示例:
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
//errno: Last error number
return 0;
}
总结
以上为本文的主要内容,技术有限,若有错误,欢迎指正。