Strcat,strcpy,strcmp,Strlen函数原型
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;
}
|