之前一段时间在跑招聘的时候,经常有面试官让当场写字符串处理函数strcpy、strcat、strcmp、strchr等等
虽然实现起来比较简单,但是还是写此博客记录一下;
0000:strcpy
strcpy函数原型为:
char *strcpy(char* dest, const char *src);
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间;
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;
返回值:指向dest的指针;
<string.h>中的strcpy函数有一点需要注意,它会有一个内存越界的问题,当dest的空间不足以存放src中的字符串时,strcpy还是继续往后复制,直至将src中所有内容都复制过去,但是此时已经造成了内存越界,而且编译器不会报错,写程序测试;
#include<bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
char str1[6] = "12345";
char str2[20] = "9876543210abcdef";
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << endl << "after strcpy:" << endl << endl;
strcpy(str1,str2);
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
system("pause");
return 0;
}
运行结果:
很明显发生了内存越界!
下面自己实现:
#include<bits/stdc++.h>
using namespace std;
char *mystrcpy (char *dest, const char *src)
{
char *str = dest;
if(src == NULL)
return dest;
while(*str != '\0' )
{
*(str++) = *(src++);
} //[0]
return dest;
}
int main(int argc, char const *argv[])
{
char str1[6] = "12345";
char str2[20] = "9876543210abcdef";
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << endl << "after strcpy:" << endl << endl;
mystrcpy(str1,str2);
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
system("pause");
return 0;
}
[0]处的while内容换成while( (*str++ = *src++) != '\0');效果就与原版的strcpy相同;
运行结果:
0001:strcat
函数原型为:
char *strcat(char *dest, const char *src);
功能:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src,*src中原有的字符不变;
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串;
返回值:返回指向dest的指针;
strcat存在与strcpy相同的内存越界问题,验证之:
#include<bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
char str1[6] = "12345";
char str2[20] = "9876543210abcdef";
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << endl << "after strcpy:" << endl << endl;
strcat(str1,str2);
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
system("pause");
return 0;
}
运行结果:
直接强行将str2接在了str1的后面,此时已经内存越界了!
自己实现:
此时效果与原版的相同,如果想避免内存泄露问题,我想到的是将dest的空间长度参数传进去,作为限位控制数,如果你们有其他较好的想法,欢迎留言贴出来分享一下;
#include<bits/stdc++.h>
using namespace std;
char *mynewstrcat (char *dest, int size,const char *src)
{
int cnt = 0;
char *str = dest;
if(src == NULL)
return dest;
while(*str != '\0')
{
str++;
cnt++;
}
while(*src != '\0' && cnt < size-1)
{
*(str++) = *(str2++);
cnt++;
}
*str = '\0';
return dest;
}
int main(int argc, char const *argv[])
{
char str1[6] = "12345";
char str2[20] = "9876543210abcdef";
char str3[10] = "54321";
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << "str3: " << str3 << endl;
cout << endl << "after mynewstrcat:" << endl << endl;
mynewstrcat(str1,6,str2);
mynewstrcat(str3,10,str2);
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << "str3: " << str3 << endl;
system("pause");
return 0;
}
运行结果:
str1空间已满,所以没有连接新的字符;str3还剩4个字符空间,所以连接了4个字符;并没有造成内存越界;
0011:strcmp
明天再继续。。。