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

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

1

2

3

4

5

6

7

8

char strcpychar *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. //保存目标字符串的首地址

  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;

  17.  

 

字符串拷贝函数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;

}

 

charstrcat 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 *strstrconst 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值