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

最新更新strncpy strstr函数

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

  • strlen的实现
 1 #include<iostream>
 2 #include<cassert>
 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++) != '')
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<iostream>
 2 #include<cassert>
 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 == '')
14     {
15         return 0;
16     }
17     return 1 + my_strlen_R(str + 1);
18 }
  • strcpy的实现
#include<iostream>
#include<cassert>
using namespace std;

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



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

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

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

  • strcat的实现
 1 #include<iostream>
 2 #include<cassert>
 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 != '')
12     {
13         pdest++;
14     }
15     while (*psrc != '')
16     {
17         *(pdest++) = *(psrc++);
18     }
19     *pdest = '';
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<iostream>
 2 #include<cassert>
 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 != ''&& *pstr2 != '')
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<iostream>
 2 #include<cassert>
 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 != '' && n-- > 0)
13     {
14         *(pdst++) = *(psrc++);
15     }
16     if (*psrc == '')
17     {
18         *pdst = '';
19     }
20     return dst;
21 }

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

  • strstr函数
 1 #include<iostream>
 2 #include<cassert>
 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 == '')
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

 

 

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

原文链接: https://www.cnblogs.com/lenomirei/p/5456648.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/390928

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月31日 上午10:08
下一篇 2023年3月31日 上午10:08

相关推荐