写出完整版的strcpy函数及其他如:strcat,strcmp,strstr的函数实现

时间:2023-03-08 18:41:21

(---牛客网中刷题---)写出完整版的strcpy函数

如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

2分

1
2
3
4
void strcpychar *strDest, char *strSrc )
{
  while( (*strDest++ = * strSrc++) != ‘\0’ );
}

4分

1
2
3
4
5
void strcpychar *strDest, const char *strSrc ) 
//将源字符串加const,表明其为输入参数,加2分
{
  while( (*strDest++ = * strSrc++) != ‘\0’ );
}

7分

1
2
3
4
5
6
void strcpy(char *strDest, const char *strSrc) 
{
 //对源地址和目的地址加非0断言,加3分
 assert( (strDest != NULL) && (strSrc != NULL) );
 while( (*strDest++ = * strSrc++) != ‘\0’ );
}

10分

//为了实现链式操作,将目的地址返回,加3分!

char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
return address;
}
 

字符串拷贝函数strcpy的原型:

char *strcpy(char *strDest,const char *strSrc);

strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:

char str[20];

int length = strlen( strcpy(str, “Hello World”) );

作用:为了生成链式表达式。

在面试中常会遇到写 strcpy,以及相关的问题,比如说返回值的作用等。

->strcpy,strcat,strcmp,strstr的函数实现如下所示:

char * strcpy(char* dst,const char* src)
{
assert((dst!=NULL)&&(src!=NULL));
char* cp=dst;
while(*src!='\0')
{
*dst=*src;
src++;
dst++;
}
*dst='\0';
return cp;
} char* strcat ( char * dst , const char * src )
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while(*src!='\0')
{
*cp++=*src++;
}
*cp='\0';
return dst; /* return dst */
} int strcmp(const char* str1, const char* str2)
{
int ret = 0;
while(!(ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1)
{
str1++;
str2++
}
if (ret < 0)
{
return -1;
}
else if (ret > 0)
{
return 1;
}
return 0;
} char *strstr( const char *s1, const char *s2 )
{
int len2;
if ( !(len2 = strlen(s2)) )
return (char *)s1;
for ( ; *s1; ++s1 )
{
if ( *s1 == *s2 && strncmp( s1, s2, len2 )==0 )
return (char *)s1;
}
return NULL;
}

strcat:将两个char类型连接

char d[20]="GoldenGlobal"; char *s="View"; strcat(d,s);
结果放在d中
printf("%s",d);
输出 d 为 GoldenGlobalView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针

strcmp:比较两个字符串str1和str2

若str1=str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。

strstr:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。