程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 面試基礎(一)-字符串函數,面試基礎字符串函數

面試基礎(一)-字符串函數,面試基礎字符串函數

編輯:C++入門知識

面試基礎(一)-字符串函數,面試基礎字符串函數


最新更新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++) != '\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<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 == '\0')
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 != '\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<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 != '\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<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 != '\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<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 != '\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<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 == '\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

 

 

啊!對了!最後說一句,參數類型和返回值還有參數的檢查都是考察中很重要的點,千萬不要在這裡大意,這種錯誤是面試官無法原諒的,循環那出點小錯面試官可能還能放你一馬,但是因為這種程序很基礎,參數這塊的細節非常讓面試官在意

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved