Strcat,strcpy,strcmp,Strlen函数原型-实现

 
Strcat,strcpy,strcmp,Strlen函数原型
2011-07-05 18:55
转载自 分享
最终编辑 komany

1、Strcat函数原型如下:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
char *strca(char *dst, const char * src)
{
char *dst_t;
dst_t = (char *)malloc(sizeof(dst) + sizeof(src));
char *start = dst_t;
assert(dst && src);
while(*dst_t = *dst)
{
dst_t++; dst++;
}
while(*dst_t = *src)
{
dst_t++; src++;
}
*dst_t = '\0';
return start;
}
下面,贴上一个我自己写的strcpy函数,以做比较;相比之下,我自己写的这个strcpy效率就显得低了。

char * my_strcat(char *s, char *t)
{
int i;
char *st, *p_st, *p_s, *p_t;
st = (char *)malloc(strlen(s)+strlen(t)+1);
if(st == NULL)
{  
   return NULL;
   printf("malloc fail!\n");
}
p_st = st;
p_s = s;
p_t = t;
for(i = 0; i < strlen(s); i++)
   *(p_st++) = *(p_s++);

for(i = strlen(s); i<(strlen(s) + strlen(t)); i++)
   *(p_st++) = *(p_t++);
*p_st = '\0';
return st;
  
}

int main()
{
char *dst = {"wo ai "};
char *src = {"wo de guo jia !"};
printf("%s\n",strca(dst,src));
return 0;
}
2、Strcpy函数原型如下:
char *strcpy(char *strDest, const char *strScr)
{
char *address=strDest;
assert((strDest != NULL) && (strScr != NULL));
while(*strScr) //是while(*strScr != ’\0’)的简化形式;
{
*strDest++ = *strScr++;
}
*strDest = '\0'; //当strScr字符串长度小于原strDest字符串长度
return address; //时,如果没有改语句,就会出错了。
}
以下是在VC6.0中调试的例子,函数名用strcpya代替。
#include <stdio.h>
#include <assert.h>
char *strcpya(char *strDest, const char *strScr)
{
char *address = strDest;
assert((strDest != NULL) && (strScr != NULL));
while(*strScr)
{
*strDest++ = *strScr++;
}
*strDest = '\0';
return address;
}

void main()
{
char str1[100]={"i love"};
char str2[50]={"China"};
printf("%s\n",strcpya(str1,str2));
}
3、Strcmp函数原型如下:
int strcmp (const char *str1,const char *str2)
{
int len = 0;
assert((str1 != '\0') && (str2 != '\0'));
while(*str1 && *str2 && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1-*str2;
}
以下是在VC6.0中调试的例子,函数名用strcmpa代替。
#include <stdio.h>
#include <assert.h>
int strcmpa (const char *str1,const char *str2)
{
int len = 0;
assert((str1 != '\0') && (str2 != '\0'));
while(*str1 && *str2 && (*str1==*str2))
{
str1++;
str2++;
}
return *str1-*str2;
}

void main()
{
char str1[100] = {"i love"};
char str2[50] = {"China "};
printf("%d\n",strcmpa(str1,str2));
}
4、Strlen函数原型如下:
int strlen(const char *str)
{
int len = 0;
assert(str != NULL);
while(*str++)
{
len++;
}
return len;
}
以下是在VC6.0中调试的例子,函数名用strlena代替。
#include <stdio.h>
#include <assert.h>
int strlena(const char *str)
{
int len = 0;
assert(str != NULL);
while(*str++)
{
len++;
}
return len;
}
void main()
{
char str1[100] = {"i love"};
char str2[50] = {"China "};
printf("%d\n",strlena(str1));

------------------------
strcpy:
/**********************
* C语言标准库函数strcpy的一种典型的工业级的最简实现
* 返回值:
* 返回目标串的地址。
* 对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。
* 参数:
* strDeatination
*          目标串
* strSource
* 源串
***********************/
VERSION 1:
char *strcpy(char *strDestination, const char *strSource);
{
assert(strDestination && strSource);
char *cp=strDestination;
while(*cp++ = *strSource++);

return strDestination;
}


VERSION 2:
char* strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
;                            /* Copy src over dst */
return( dst );

}

VERSION 3:
char *srcpy(char *dest,const char *source)
{

assert((dest!=NULL)&&(source!=NULL));
char *address = dest;

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

*dest = '\0';
return address;

}


strcat:

VERSION 1:
char * strcat(char * dest, const char * src)
{
char *tmp = dest;
while (*dest)
dest++;
while ((*dest++ = *src++) != '\0')
;

return tmp;
}



strcmp:

VERSION 1:
int strcmp ( const char* src, const char* dst )
{
int ret = 0 ;
while( !(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}

VERSION 2:
int strcmp(const char *dest, const char *source)  
{  
assert((NULL != dest) && (NULL != source));  
while (*dest && *source && (*dest == *source))  
{  
dest ++;  
source ++;  
}  
return *dest - *source;  
/*如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest < source ,则返回值小于0。*/
}

VERSION 3:
int strcmp(char *source, char *dest)
{
assert(source != NULL && dest != NULL);
while(*source++==*dest++)
{
if(*source=='\0'&&*dest=='\0')
return 0;       
}
return -1;
}


itoa:

#include "stdafx.h"
#include <iostream>
using namespace std;
void itoa(int num,char str[] )
{
int sign = num,i = 0,j = 0;
char temp[11];
if(sign<0)//判断是否是一个负数
{
num = -num;
};
do
{
temp[i] = num%10+'0';       
num/=10;
i++;
}while(num>0);
if(sign<0)
{
temp[i++] = '-';//对于负数,要加以负号
}
temp[i] = '\0';
i--;
while(i>=0)//反向操作
{
str[j] = temp[i];
j++;
i--;
}
str[j] = '\0';
}


atoi:

int atoi(char s[])

{

int i = 0,sum = 0,sign;    //输入的数前面可能还有空格或制表符应加判断

while(' '==s[i]||'\t'==s[i])
{
i++;
}

sign = ('-'==s[i])?-1:1;
if('-'==s[i]||'+'==s[i])
{
i++;
}
while(s[i]!='\0')
{
sum = s[i]-'0'+sum*10;
i++;
}   
return sign*sum;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
strlenstrcpystrcmpstrcat都是C语言中的字符串处理函数。其中strlen是用来计算字符串的长度的函数,其语法为:size_t strlen(const char *str),其中str表示需要计算长度的字符串。该函数的返回值为一个size_t类型的无符号整数,表示字符串的长度,不包括空字符('\0')。例如,若str为"hello",则strlen(str)的结果为5。 strcpy是用于将一个字符串复制到另一个字符串中的函数。其语法为:char *strcpy(char *dest, const char *src),其中dest表示目标字符串的地址,src表示需要复制的源字符串的地址。该函数会将src中的内容复制到dest中,并返回dest的值。例如,若src为"hello",dest为一个长度为10的字符数组,则执行strcpy(dest, src)后,dest数组中就存储了"hello"这个字符串。 strcmp是用于比较两个字符串是否相等的函数。其语法为:int strcmp(const char *s1, const char *s2),其中s1和s2表示需要比较的两个字符串。该函数会先比较s1和s2的第一个字符,若相同则继续比较后面的字符,直到不相等为止。返回值为一个整数,若s1>s2则返回正整数,若s1<s2则返回负整数,若s1=s2则返回0。例如,若s1为"abc",s2为"abd",则执行strcmp(s1, s2)后,返回的值为负整数。 strcat是用于将两个字符串连接起来的函数。其语法为:char *strcat(char *dest, const char *src),其中dest表示目标字符串的地址,src表示需要添加的源字符串的地址。该函数会将src中的内容添加到dest的末尾,并返回dest的值。例如,若dest为"hello",src为"world",则执行strcat(dest, src)后,dest数组中存储了"helloworld"这个字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值