最新更新strncpy strstr函數
之前一段時間去上海參加比賽,回來之後收到了面試通知,趁著這個機會重新寫了一下基礎,發現小錯誤還是蠻多的,順便把代碼就粘上來了,也沒啥好說的學過C語言都知道的幾個str函數,同學面試騰訊的時候也問到了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函數的內存覆蓋有點東西
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 }
#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


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