指针与字符串的函数模拟
C语言没有string类,C的字符串就是字符数组,并以‘\0’为字符串结束符。这种字符串被称为C风格字符串,由于是底层操作,相关函数在编程中有特别的地位,有很多经典的指针用法。其实,数组就是指针,STL也不过如此,string引入了类,从而加入了方法等,让其更简单。C语言是底层操作,操作内存不在话下,指针是经典例子。
字符数组的初始化如下:
char s[] = {'a', 'b', 'c', 'd', '\0'}; //定义s并初始化abcd
char s[] = "abc"; //同上,更简单
由于数组是静态的,定义后就不能修改长度了,使用时要注意,s="abcde"
是不允许的,要使用strcpy才可以。
好了,我们来模拟一下strcpy(拷贝)、strlen(测长)、strcmp(字符串比较)和strstr(查找子串)的功能
1、实现strcpy
char * strcpy(char *dest, const char *src)
{
char *p = dest;
while (*src != '\0')
{
*dest = *src;
dest++; src++;
}
*dest='\0';
return p;
}
2、实现strlen
size_t strlen(const char * str)
{
const char *cp =str; //开始指针
while(*cp++ ) ; //找到结束
rerutn (cp- str- 1);
}
3、实现strcmp
int strcmp(const char * src, const char * dst)
{
//依照字典序
int ret = 0;
while (!(ret = *src - *dst) && *dst) //相等且没有结束
++ src, ++ dst; //整体加一
return ( ret);
}
4、实现strstr
char * strstr (char* buf, char *sub)
{
if(!*sub)
return buf; //特殊情况
char *bp, *sp;
while (*buf)
{
bp = buf;
sp = sub;
do{
if(!*sp)
return buf;
} while (*bp++ == *sp++);
buf++;
}
return 0;
}