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