您的位置:首页 > 其它

自写字符串操作函数

2015-12-02 16:29 204 查看
【字符操作函数】

1.strstr()函数用来检索子串在字符串中首次出现的位置,其原型为:
char *strstr( const char *dest,const char * src );

【参数说明】dest为要检索的字符串,src为要检索的子串。

【返回值】返回字符串str中第一次出现子串src的地址;如果没有检索到子串,则返回NULL。

【函数实现】
#include <stdio.h>

char* my_strstr(const char *dest,const char *str)
{
char *ptr=(char *)dest;
char *p1=NULL;
char *p2=NULL;
while (*ptr)
{
p1=ptr;
p2=(char *)str;
while (*p1==*p2)
{
p1++;
p2++;
if (*p2=='\0')
{
return ptr;
}
}
ptr++;
}
return NULL;
}
结果:



2.strcat()函数用来连接字符串,其原型为:
char *strcat(char *dest ,const char *src)

【参数】dest 为目的字符串指针,src 为源字符串指针。

strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。

注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。

【返回值】返回dest 字符串起始地址。
【函数实现】
#include <stdio.h>
#include <assert.h>
#define MAXLINE 100

char* my_strcat(char *dest,const char *src)
{
char *pstr=dest;
assert(dest);
assert(src);
while (*dest)
{
dest++;
}
while (*dest++=*src++)
{
;
}
return pstr;
}

int main()
{
char arr[MAXLINE]="abcd";
char *p="efgh";
char *ret=my_strcat(arr,p);
printf("%s\n",ret);
return 0;
}


结果:




3.strcmp()函数用来比较字符串大小,其原型为:

int strcmp( const char *dest,
const char *src)
【参数】dest,src为需要比较的两个字符串。

字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将dest 第一个字符值减去src 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。

【返回值】若参数dest 和src 字符串相同则返回0。dest 若大于src从则返回大于0 的值。dest 若小于src则返回小于0 的值。

注意:strcmp() 以二进制的方式进行比较
【函数实现】
#include <stdio.h>
#include <assert.h>

int my_strcmp(const char *str1,const char *str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1 - *str2);
}
int main()
{
char *str1="abcde";
char *str2="abcfe";
int ret = my_strcmp(str1,str2);
if (ret > 0)
{
printf("str1 > str2\n");
}
else if(ret < 0)
{
printf("str1 < str2\n");
}
else
printf("str1 =str2\n");
return 0;
}
结果:



4.strlen()函数用来计算字符串长度,其原型为:
size_t strlen( const char *string );
【参数说明】string为指定的字符串。

strlen()用来计算指定的字符串string 的长度,不包括结束字符"\0"。

【返回值】返回字符串string 的字符数。

【注意】 strlen() 函数计算的是字符串的实际长度,遇到第一个'\0'结束。如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止。而sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数。
【函数实现】
/*
*计数器方法实现
*/
#include <stdio.h>
#include <assert.h>

int my_strlen(const char *str)
{
int count=0;
assert(str);//断言
while (*str)
{
count++;
str++;
}
return count;
}

int main()
{
char arr[]="abcde";
int ret=my_strlen(arr);
printf("%d\n",ret);
return 0;
}

/*
**递归方法实现
*/
#include <stdio.h>
#include <assert.h>

int my_strlen(const char *str)
{
assert(str);
if (*str=='\0')
{
return 0;
}
else
{
return (1+my_strlen(str+1));
}
}

int main()
{
char arr[] = "abcde";
int ret = my_strlen(arr);
printf("%d\n",ret);
return 0;
}

/*
**指针方式实现
*/
#include <stdio.h>

int my_strlen(const char *str)
{

const char *p=str;
while (*str)
{
str++;
}
return str-p;
}

int main()
{
char arr[]="abcde";
int ret=my_strlen(arr);
printf("%d\n",ret);
return 0;
}
结果:



5.strcpy()函数,函数原型
char *strcpy(char *dest, const char *src);

【函数说明】:strcpy()会将参数src 字符串拷贝至参数dest 所指的地址。

【返回值】:返回参数dest 的字符串起始地址。

【函数实现】
#include <stdio.h>
#include <assert.h>
#define MAX 20

void my_strcpy(char *dest,char *str)
{
assert(dest);
assert(str);
while (*dest++=*str++);
}
int main()
{
char arr[MAX]={0};
char *ps="abcde";
my_strcpy(arr,ps);
printf("%s\n",arr);
return 0;
}
结果:




注意:为什么结果是abcde呢?后面的0怎么没有打印出来,因为字符串是以‘\0’作为结束标志的,而‘\0’的对应的ASCII码值正好是0,所以就自然而然的结果是abcde了!

本文出自 “Pzd流川枫” 博客,请务必保留此出处http://xujiafan.blog.51cto.com/10778767/1718912
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: