面试基础(一)-字符串函数
2016-05-20 14:13
357 查看
最新更新strncpy strstr函数
学过C语言都知道的几个str函数,同学面试腾讯的时候也问到了strlen的递归实现,我也给出来~
strlen的实现
话说这真的不是很难,要说难一点的还是mem函数的内存覆盖有点东西
strlen的递归实现
strcpy的实现
还是有坑的,因为strcpy的实现是根据src参数的'\0'进行循环条件的判定,所以方向拷贝的时候内存不够就会越界访问了,还是蛮危险的,所以才推荐使用strncpy
strcat的实现
strcmp的实现
strncpy函数的实现
使用strncpy的时候如果给的n值比src字符串的长度要短,拷贝之后会变成“拷贝部分的dst”+“剩下的src”,如果要长,会把'\0'添上,那就只有src部分了,dst就打不出来了
strstr函数
子串查找函数,,找到了返回找到的位置的指针,找不到返回NULL
啊!对了!最后说一句,参数类型和返回值还有参数的检查都是考察中很重要的点,千万不要在这里大意,这种错误是面试官无法原谅的,循环那出点小错面试官可能还能放你一马,但是因为这种程序很基础,参数这块的细节非常让面试官在意
学过C语言都知道的几个str函数,同学面试腾讯的时候也问到了strlen的递归实现,我也给出来~
strlen的实现
#include<iostream> #include<cassert> using namespace std; int my_strlen(const char * str) { assert(str); int count = 0; const char *ptr = str; while (*(ptr++) != '\0') { count++; } return count; } int main() { char *str = "hehe"; cout << my_strlen(str) << endl; return 0; }
话说这真的不是很难,要说难一点的还是mem函数的内存覆盖有点东西
strlen的递归实现
#include<iostream> #include<cassert> using namespace std; int _strlen_R(const char *str) { assert(str); return my_strlen_R(str); } int my_strlen_R(const char *str) { if (*str == '\0') { return 0; } return 1 + my_strlen_R(str + 1); }
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的实现
#include<iostream> #include<cassert> using namespace std; char *my_strcat(char *dest,const char *src) { assert(dest && src); char *pdest = dest; const char *psrc = src; while (*pdest != '\0') { pdest++; } while (*psrc != '\0') { *(pdest++) = *(psrc++); } *pdest = '\0'; return dest; } int main() { char s1[20] = "hello"; char s2[] = "world"; cout << my_strcat(s1, s2) << endl; return 0; }
strcmp的实现
#include<iostream> #include<cassert> using namespace std; int my_strcmp(const char *str1, const char *str2) { assert(str1 && str2); const char *pstr1 = str1; const char *pstr2 = str2; while (*pstr1 != '\0'&& *pstr2 != '\0') { pstr1++; pstr2++; } if (*pstr1) { return 1; } if (*pstr2) { return -1; } return 0; } int main() { char s1[] = "helloword"; char s2[] = "helloword"; cout << my_strcmp(s1, s2) << endl; return 0; }
strncpy函数的实现
#include<iostream> #include<cassert> using namespace std; char *my_strncpy(char *dst, const char *src, int n) { assert(dst && src); char *pdst = dst; const char *psrc = src; while (*psrc != '\0' && n-- > 0) { *(pdst++) = *(psrc++); } if (*psrc == '\0') { *pdst = '\0'; } return dst; }
使用strncpy的时候如果给的n值比src字符串的长度要短,拷贝之后会变成“拷贝部分的dst”+“剩下的src”,如果要长,会把'\0'添上,那就只有src部分了,dst就打不出来了
strstr函数
#include<iostream> #include<cassert> using namespace std; char *my_strstr(char *str1, const char *str2) { assert(str1 && str2); char *pstr1 = str1; const char *pstr2 = str2; for (int i = 0; i < strlen(str1); i++) { pstr1 = &str1[i]; pstr2 = str2; while (*(pstr1++) == *(pstr2++)) { if (*pstr2 == '\0') { return &str1[i]; } } } return NULL; } int main() { char str1[] = "hello world"; char str2[] = "lo w"; cout << my_strstr(str1, str2); return 0; }
子串查找函数,,找到了返回找到的位置的指针,找不到返回NULL
啊!对了!最后说一句,参数类型和返回值还有参数的检查都是考察中很重要的点,千万不要在这里大意,这种错误是面试官无法原谅的,循环那出点小错面试官可能还能放你一马,但是因为这种程序很基础,参数这块的细节非常让面试官在意
相关文章推荐
- Stay教你程序员泡妞攻略
- 码农只能干到30岁的新理由
- 《招一个靠谱的移动开发》iOS面试题及详解(下篇)
- 《招一个靠谱的移动开发》iOS面试题及详解(下篇)
- 程序员的表白情书“520”大声喊出来
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
- 腾讯 5.20 2017暑期软件开发实习生笔试+面试
- 常见的单链表面试题
- 剑指Offer----面试题六:重建二叉树
- 父域与子域的帐户是否可以相互登陆
- 优秀程序员的十个习惯
- 面试必备 - 经典冒泡排序Java
- BAT及各大互联网公司2014前端笔试面试题:HTML/CSS篇
- Java面试题
- java 面试题记要
- 程序员健康面临的几个问题
- 程序员这个职业的危险期你知道吗
- java面试智力题
- java算法面试题