(---牛客網中刷題---)寫出完整版的strcpy函數
如果編寫一個標准strcpy函數的總分值為10,下面給出幾個不同得分的答案:
2分
1
2
3
4
|
void
strcpy
(
char
*strDest,
char
*strSrc )
{
while
( (*strDest++ = * strSrc++) != ‘\0’ );
}
|
4分
1
2
3
4
5
|
void
strcpy
(
char
*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。