zoukankan      html  css  js  c++  java
  • 面试基础(一)-字符串函数

    最新更新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

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

  • 相关阅读:
    真彩色、假彩色和伪彩色的区别
    octave——基本操作
    Octave快速入门级下载链接
    unix下的常用命令
    职业——步入工作前的一点感悟
    Python—实例中self含义
    面向对象编程
    mysql查看数据表索引信息
    解决yii框架,gii脚手架不能使用。
    php 多维数组简化(递归)
  • 原文地址:https://www.cnblogs.com/lenomirei/p/5456648.html
Copyright © 2011-2022 走看看