您的位置:首页 > 职场人生

面试基础(一)-字符串函数

2016-05-20 14:13 357 查看
最新更新strncpy strstr函数

学过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

啊!对了!最后说一句,参数类型和返回值还有参数的检查都是考察中很重要的点,千万不要在这里大意,这种错误是面试官无法原谅的,循环那出点小错面试官可能还能放你一马,但是因为这种程序很基础,参数这块的细节非常让面试官在意
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: