写在前面:现在在刷简单题的时候,老是遇到字符串操作的题,用c语言自己实现很麻烦,其实c语言也有很多对字符串操作很方便的库函数。这个博客写来一是为了巩固自己一下自己学的知识,二也可以方便大家查询。
一. 使用详解(都包含在头文件定义:
size_t strlen ( const char * str ); //strlen返回的时在字符串中' '前出现的字符个数(不包含' '),若没有' '则返回随机值 //返回值为size_t类型,是无符号的
功能:求一个字符串的长度(元素个数)
2、strcpy定义:
char* strcpy(char * destination, const char * source ); //源字符串必须以 ' ' 结束。 //会将源字符串中的 ' ' 拷贝到目标空间。 //目标空间必须足够大,以确保能存放源字符串。 //目标空间必须可变。
功能:将一个字符串完整地拷贝到目标字符串中
3、strcat定义:
char * strcat ( char * destination, const char * source ); //源字符串必须以 ' ' 结束。 //目标空间必须有足够的大,能容纳下源字符串的内容。 //目标空间必须可修改。
功能:将一个字符串(source)中的内容追加到另一个字符串(destination)中
4、strcmp定义:
int strcmp ( const char * str1, const char * str2 );
功能:比较两字符串的大小
第一个字符串大于第二个字符串,则返回大于0的数字(有些编译器返回1)
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字(有些编译器返回-1)
5、strstr定义:
char * strstr ( const char *str1, const char * str2);
功能:在str1中查找与str2内容相同的部分,若找到了,则返回该部分字符串的地址,若没有则返回NULL
二. 模拟实现 1、模拟实现strlen//三种方式
//方式一:计数器
int my_strlen(const char* str)
{
int count;
while(*str)
{
count++;
str++;
}
return count;
}
//方式二:递归
int my_strlen(const char* str)
{
if(*str==' ')
return 0;
else
return 1+my_strlen(str+1);
}
//方式三:指针减指针
int my_strlen(const char* str)
{
char* p=str;
while(*p!=' ')
{
p++;
}
return p-str;
}
2、模拟实现strcpy
//模拟实现strcpy:
//将源字符串中的内容全部复制到目标控空间中,返回一个char*
char* my_strcpy(char* dest,const char*src)
{
assert(dest !=NULL);
assert(src !=NULL);//断言
char* ret=dest;
while(*dest++ = *src++)
{
;
}
return ret; //ret中的值就是dest中的值,他们指向的地址是一样的
//所以可以找到dest指向的内容
}
3、模拟实现strcat
//模拟实现strcat:向目标地址追加源地址中字符串的内容
char* my_strcat(char* dest,const char* src)
{
char* ret=dest;
assert(dest!=NULL);
assert(src!=NULL);
while(*dest)
{
dest++;
}
while(*dest++ = *src++)
{
;
}
return ret;
}
4、模拟实现strcmp
//模拟实现strcmp:比较两个字符串的大小,每个字符逐一比较,直到出现差异或是全部比较完
//前一个字符串比后一个字符串大返回1(也有些编译器返回大于0的数),小返回-1(也有些编译器返回小于0的数),相等返回0
int my_strcmp(const char* a1,const char* a2)
{
assert(a1 != NULL);
assert(a2 != NULL);
int ret=0;
while(!(ret=*(unsigned char*)a1-*(unsigned char)a2) && *dst)
{
++a1,++a2;
}
if(ret<0)
{
return -1;
}
else if(ret>0)
{
return 1;
}
return 0;
}
5、模拟实现strstr
//模拟实现strstr:返回后一个字符串在前一个字符串中的位置(指针),如果没有这一部分则返回NULL
//可以去了解一下KMP算法
char* strstr(const char* str1.const char *str2)
{
assert(str1 && str2);
char* s1 = str1;
char* s2 = str2;
char* p = str1;
while(*p)
{
s1=p;
s2=str2;
while(*s1 && *s2 && *s1==*s2)
{
s1++;
s2++;
}
if(*s2==' ')
{
return p;
}
p++;
}
return NULL;
}



