您的位置:首页 > 其它

自己实现字符串的各个函数功能

2016-07-16 13:00 211 查看
在对字符串进行操作的时候,我们常常会用到字符串的相关函数,如strcmp(),strncmp(),strlen(),strcpy(),strncpy(),strcat(),strncat()函数,今天我就针对这些函数,进行使用讲解以及如何自己编写相应的程序来实现其功能。

字符串比较函数:strcmp()&&strncmp()

1.  int strcmp(const char *s1, const char *s2)

头文件:string.h

功能:比较字符串(区分大小写)

返回值:若字符串s1和字符串s2相同,则返回0;

      若字符串s1大于字符串s2,则返回正数;

              若字符串s1小于字符串s2,则返回负数。

注:是使用二进制的方式进行比较,而且字符串大小的比较是一ASCII码值进行比较的,首先s1和s2的第一个字符进行比较,若差值为0则继续比较,否则就讲差值返回。只可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
自己编写的实现strcmp()相同功能的函数my_strcmp():
<span style="font-size:18px;"><strong>#include <stdio.h>

int my_strcmp(const char * s1,const char * s2)
{

while(*s1 != '\0')
{
if((*s1 - *s2) == 0)
{
s1 ++;
s2 ++;
}
else
{
if((*s1 - *s2) > 0)
{
return 1;
break;
}
else
{
return -1;
break;
}
}
}

if(*s2 != '\0')
{
return -1;
}

return 0;
}

int main()
{
int res;

char *s1 = "hello";
char *s2 = "hello";

res = my_strcmp(s1,s2);

switch(res)
{
case -1:
printf("s1 < s2\n");
break;
case 0:
printf("s1 = s2\n");
break;
case 1:
printf("s1 > s2\n");
break;
default:
printf("Error!");
}

return 0;
}</strong></span>
上面的函数调试结果为:
s1 = s2
这个程序主函数里进行比较的字符串是我自己设定的,大家也可以自己添加,从scanf录入。

                2. int strncmp(const char *s1, const char *s2, size_t n)

头文件:string.h

功能:比较指定比较数目前n个字符串(区分大小写)

返回值:若字符串s1和字符串s2前n个字符相同,则返回0;

             若字符串s1前n个字符大于字符串s2前n个字符,则返回正数;

             若字符串s1前n个字符小于字符串s2前n个字符,则返回负数。

自己编写的实现strncmp()相同功能的函数my_strncmp():
<span style="font-size:18px;">#include <stdio.h>

int my_strncmp(const char * s1,const char * s2,size_t n)
{
int i;

for(i = 0;i < n;i ++)
{
if(*s1 == *s2)
{
s1 ++;
s2 ++;
}
else
{
if(*s1 > *s2)
{
return 1;
break;
}
else
{
return -1;
break;
}
}
}

return 0;
}

int main()
{
int res;
int n = 2;

char *s1 = "hi!";
char *s2 = "hello world!";

res = my_strncmp(s1,s2,n);

switch(res)
{
case -1:
printf("s1 < s2.\n");
break;
case 0:
printf("s1 = s2.\n");
break;
case 1:
printf("s1 > s2.\n");
break;
default:
printf("Error!");
}

return 0;
}</span>
调试结果如下:
s1 > s2.


字符串拷贝函数:strcpy()&&strcncpy()

1.char *strcpy(char *dest,const char *src)

头文件:string.h

功能:把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间.

返回值:char * 类型,即指向dest的指针。

注:src和dest所指向的内存地址不可以重叠,且dest要有足够的空间来存放src的字符串。

自己编写函数my_strcpy()以实现跟strcpy()相同的函数功能:

#include <stdio.h>

char *my_strcpy(char *dest,char *src)
{
char *temp = dest;

while(*src != '\0')
{
*temp = *src;

temp ++;
src ++;
}

*temp = '\0';

return dest;
}

int main()
{
char dest[20] = "hello world!";
char src[20] = "hi!";

char *res = my_strcpy(dest,src);

printf("The copied string is:%s\n",res);

return 0;
}
调试结果为:
The copied string is:hi!

2.char *strncpy(char *dest, const char *src, size_t n)

头文件:string.h

功能:把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中

返回值:dest

自己编写程序my_strncpy()以实现与strncpy()相同的函数功能:

#include <stdio.h>

#define MAX_SIZE 1024

char * my_strncpy(char * dest,char * src,size_t n)
{
int i;

char *temp = dest;

for(i = 0;i < n; i ++)
{
*temp = *src;

temp ++;
src ++;
}

return dest;
}

int main()
{
int n = 3;

char dest[MAX_SIZE] = "hi Nancy!";
char src[MAX_SIZE] = "hello world!";

char *res = my_strncpy(dest,src,n);

printf("The copied string is:%s\n",dest);

return 0;
}
调试结果为:
The copied string is:helNancy!


strcpy()和strncpy()的区别:

strcpy()只是复制字符串,但不限制复制的数量,很容易造成缓冲溢出,而strncpy()则相对安全一点。
strncpy()能够选择一段字符输出,strcpy()不能。

字符串长度函数:strlen()
size_t strlen(const char *s)

头文件:string.h

      功能:计算字符串的长度

     返回值:字符串的长度

注:字符串长度不包括结束符'\0'。

自己编写my_strlen()函数以实现strlen()的相应的功能;
#include <stdio.h>

#define MAX_SIZE 1024

size_t my_strlen(const char *src)
{
int len = 0;

while(*src != '\0')
{
len ++;

src ++;
}

return len;
}

int main()
{
int len;

char src[MAX_SIZE] = "hello world!";

len = my_strlen(src);

printf("The lenght of the string is:%d.\n",len);

return 0;
}


调试结果为:
The lenght of the string is:12.


字符串连接函数:strcat() && strncat()

1.char *strcat(char *dest,const char *src)

头文件:string.h

                功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。

               返回值:连接后的字符串dest。

自己编写的my_strcat()函数以实现strcat()的功能:

#include <stdio.h>

#define MAX_SIZE 1024

char *my_strcat(char *dest,char *src)
{
char *temp = dest;

while(*temp != '\0')
{
temp ++;
}

while(*src != '\0')
{
*temp = *src;

temp ++;
src ++;
}

return dest;
}

int main()
{
char dest[MAX_SIZE] = "hello world!";
char src[MAX_SIZE] = "hi!";

char *res = my_strcat(dest,src);

printf("The linked string is:%s\n",dest);

return 0;
}

调试结果为:
The linked string is:hello world!hi!

2.char *strncat(char *dest,const char *src,size_t n)

头文件:string.h

        功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0'),再追加'\0'。

        返回值:指向dest的指针。

自己编写的my_strncat()函数以实现strncat()的功能:

#include <stdio.h>

#define MAX_SIZE 1024

char * my_strncat(char *dest,char *src,size_t n)
{
int i;

char *temp = dest;

while(*temp != '\0')
{
temp ++;
}

for(i = 0;i < n;i ++)
{
*temp = *src;

temp ++;
src ++;
}

*temp = '\0';

return dest;
}

int main()
{
int n = 4;

char dest[MAX_SIZE] = "hello world!";
char src[MAX_SIZE] = "hi Nancy!";

char *res = my_strncat(dest,src,n);

printf("The linked string is:%s\n",dest);

return 0;
}


调试结果为:

The linked string is:hello world!hi N


2.char*strncpy(char
*dest,construction char *src,size_t  n)


                                   

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: