您的位置:首页 > 教程资讯 > 皇冠体育的网址 > C++ > 面试基础(一)-字符串函数

面试基础(一)-字符串函数

发布于:2016-05-24 14:07:26   分享到:

最新更新strncpy strstr函数

学过C语言都知道的几个str函数,同学面试腾讯的时候也问到了strlen的递归实现,我也给出来~

  • strlen的实现
 1 #include
 2 #include
 3 using namespace std;
 4 
 5 
 6 int my_strlen(const char * str)
 7 {
 8     assert(str);
 9     int count = 0;
10     const char *ptr = str;
11     while (*(ptr++) != '\0')
12     {
13         count++;
14     }
15     return count;
16 }
17 
18 
19 int main()
20 {
21     char *str = "hehe";
22     cout << my_strlen(str) << endl;
23     return 0;
24 }

话说这真的不是很难,要说难一点的还是mem函数的内存覆盖有点东西

  • strlen的递归实现
 1 #include
 2 #include
 3 using namespace std;
 4 
 5 int _strlen_R(const char *str)
 6 {
 7     assert(str);
 8     return my_strlen_R(str);
 9 }
10 
11 int my_strlen_R(const char *str)
12 {
13     if (*str == '\0')
14     {
15         return 0;
16     }
17     return 1 + my_strlen_R(str + 1);
18 }
  • strcpy的实现
#include
#include
using namespace std;

char *my_strcpy(char *dest,const char *src)
{
    assert(dest && src);
    char *pdest = dest;
    const char *psrc = src;
    while (*psrc != '\0')
    {
        *(pdest++) = *(psrc++);
    }
    *pdest = '\0';
    return dest;
}

int main()
{
    char s1[] = "hahaha";
    char s2[] = "hao";
    cout << my_strcpy(s1, s2) << endl;
    return 0;
}

还是有坑的,因为strcpy的实现是根据src参数的'\0'进行循环条件的判定,所以方向拷贝的时候内存不够就会越界访问了,还是蛮危险的,所以才推荐使用strncpy

  • strcat的实现
 1 #include
 2 #include
 3 using namespace std;
 4 
 5 
 6 char *my_strcat(char *dest,const char *src)
 7 {
 8     assert(dest && src);
 9     char *pdest = dest;
10     const char *psrc = src;
11     while (*pdest != '\0')
12     {
13         pdest++;
14     }
15     while (*psrc != '\0')
16     {
17         *(pdest++) = *(psrc++);
18     }
19     *pdest = '\0';
20     return dest;
21 
22 }
23 int main()
24 {
25     char s1[20] = "hello";
26     char s2[] = "world";
27     cout << my_strcat(s1, s2) << endl;
28     return 0;
29 }
  • strcmp的实现
 1 #include
 2 #include
 3 using namespace std;
 4 
 5 
 6 
 7 int my_strcmp(const char *str1, const char *str2)
 8 {
 9     assert(str1 && str2);
10     const char *pstr1 = str1;
11     const char *pstr2 = str2;
12     while (*pstr1 != '\0'&& *pstr2 != '\0')
13     {
14         pstr1++;
15         pstr2++;
16     }
17     if (*pstr1)
18     {
19         return 1;
20     }
21     if (*pstr2)
22     {
23         return -1;
24     }
25     return 0;
26 }
27 
28 
29 int main()
30 {
31     char s1[] = "helloword";
32     char s2[] = "helloword";
33     cout << my_strcmp(s1, s2) << endl;
34     return 0;
35 }
  • strncpy函数的实现
 1 #include
 2 #include
 3 using namespace std;
 4 
 5 
 6 
 7 char *my_strncpy(char *dst, const char *src, int n)
 8 {
 9     assert(dst && src);
10     char *pdst = dst;
11     const char *psrc = src;
12     while (*psrc != '\0' && n-- > 0)
13     {
14         *(pdst++) = *(psrc++);
15     }
16     if (*psrc == '\0')
17     {
18         *pdst = '\0';
19     }
20     return dst;
21 }

使用strncpy的时候如果给的n值比src字符串的长度要短,拷贝之后会变成“拷贝部分的dst”+“剩下的src”,如果要长,会把'\0'添上,那就只有src部分了,dst就打不出来了

  • strstr函数
 1 #include
 2 #include
 3 using namespace std;
 4 char *my_strstr(char *str1, const char *str2)
 5 {
 6     assert(str1 && str2);
 7     char *pstr1 = str1;
 8     const char *pstr2 = str2;
 9     for (int i = 0; i < strlen(str1); i++)
10     {
11         pstr1 = &str1[i];
12         pstr2 = str2;
13         while (*(pstr1++) == *(pstr2++))
14         {
15             if (*pstr2 == '\0')
16             {
17                 return &str1[i];
18             }
19         }
20     }
21     return NULL;
22 }
23 int main()
24 {
25     char str1[] = "hello world";
26     char str2[] = "lo w";
27     cout << my_strstr(str1, str2);
28     return 0;
29 }

子串查找函数,,找到了返回找到的位置的指针,找不到返回NULL

啊!对了!最后说一句,参数类型和返回值还有参数的检查都是考察中很重要的点,千万不要在这里大意,这种错误是面试官无法原谅的,循环那出点小错面试官可能还能放你一马,但是因为这种程序很基础,参数这块的细节非常让面试官在意


标签:

函数 字符串

关于我们  加入我们  版权声明  商务合作  友情链接  网站地图  站长统计

脚本大全-脚本语言之家-版权所有 

Copyright (C) 2016 jiaoben.net, All Rights Reserved