strcat,strcmp,strstr,strcpy,strncpy的函数实现

(---牛客网中刷题---)写出完整版的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分!   

1
2
3
4
5
6
7
8
char  strcpy char  *strDest,  const  char  *strSrc )
{
  assert ( (strDest != NULL) && (strSrc != NULL) );
  char  *address = strDest;
  while ( (*strDest++ = * strSrc++) != ‘\0’ );
  return  address;
}
  

//strncpy()的实现

        char * my_strncpy(char *strDest, const char *strSrc, int num)

  1. {
  2. assert((strDest != NULL) && (strSrc != NULL));
  3. //if (strDest == NULL || strSrc == NULL) return NULL;
  4. //保存目标字符串的首地址
  5. char *strDestcopy = strDest;
  6. while ((num--)&&(*strDest++ = *strSrc++) != '\0');
  7. //如果num大于strSrc的字符个数,将自动补'\0'
  8. if (num > 0)
  9. {
  10. while(--num)
  11. {
  12. *strDest++ = '\0';
  13. }
  14. }
  15. return strDestcopy;

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

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

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

    char str[20];

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

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


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。  


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

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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;
}


 参考:https://www.cnblogs.com/carsonzhu/p/5277036.html     

  1. 有时间看下这个博主的关于就业刷题的博客


  1. https://blog.csdn.net/qq_34793133/article/details/80720782

 

  1. char * my_strncpy(char *strDest, const char *strSrc, int num)
  2. {
  3. assert((strDest != NULL) && (strSrc != NULL));
  4. //if (strDest == NULL || strSrc == NULL) return NULL;
  5. //保存目标字符串的首地址
  6. char *strDestcopy = strDest;
  7. while ((num--)&&(*strDest++ = *strSrc++) != '\0');
  8. //如果num大于strSrc的字符个数,将自动补'\0'
  9. if (num > 0)
  10. {
  11. while(--num)
  12. {
  13. *strDest++ = '\0';
  14. }
  15. }
  16. return strDestcopy;

猜你喜欢

转载自blog.csdn.net/qq_34793133/article/details/80908264
今日推荐