寫出完整版的strcpy函數及其他如:strcat,strcmp,strstr的函數實現


 (---牛客網中刷題---)寫出完整版的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。  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM