字符串
这里包含一些常用的C语言字符串函数的自主实现,包含代码,部分函数由于并非高频考点,因此只做功能上的描述。
strlen函数
作用:求解字符串的长度,不包含’\0’。而sizeof求解时会包含字符串的结束符’\0’。
思路就是指向字符串的指针加一,len加一,直到遇到结束符’\0’。
时间复杂度:O(N), N为字符串的长度。
注意细节:strlen传入的参数类型最好加上const,即const char* str,这表示指针的指向可以发生改变(即后面可以进行(*str++)),但是指针指向的值不允许发生改变。
直接给出代码
#include <iostream>
#include <cassert>
using namespace std;
int mystrlen(const char* str)
{
assert(str!=NULL);
int len=0;
while((*str++)!='\0')len++;
return len;
}
int main()
{
char a[]="abcdefg";
int ret=mystrlen(a);
cout<<ret<<endl;
return 0;
}
strcpy函数
功能:实现一个字符串到另一个字符串的拷贝,返回拷贝的字符串的首地址。注意传入的参数有目标字符串的首地址和源字符串的首地址,源字符串首地址应设置为const。
时间复杂度:O(N),N表示min(strlen(dest),strlen(src)).
#include <iostream>
#include <cassert>
using namespace std;
char* mystrcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while ((*dest++ = *src++) != '\0');
return ret;
}
int main()
{
const char a[] = "abcdefg";
char b[10] = "";
char* ret = mystrcpy(b, a);
cout << ret << endl;
return 0;
}
strcat函数
功能:将源字符串拼接到目标字符串的后面,返回目标字符串的首地址。注意:拼接的前提是目标字符串有足够的空间可以拼接源字符串。
时间复杂度:O(N),N表示源字符串和目标字符串长度之和。
实现思路是源字符串指针找到结束符位置,然后回退一格将结束符删去,后续和strcat思路一致。
#include <iostream>
#include <cassert>
using namespace std;
char* mystrcat(char* dest, const char* src)
{
assert(src && dest);
char* ret = dest;
while ((*dest++) != '\0');
dest--;
while ((*dest++ = *src++) != '\0');
return ret;
}
int main()
{
char a[20] = "abcdefg";
const char b[] = "hijklmn";
char* ret = mystrcat(a, b);
cout << ret << endl;
return 0;
}
内存块的操作
memset函数
memset的功能是将一块内存区域设置为特定的值,并且是按字节进行内存操作的。
代码如下:
#include <iostream>
#include <cassert>
void* mymemset(void* dest, int n, size_t count)
{
assert(dest);
char* pdest=(char*)dest;
while(count--)
{
*pdest++=c;
}
return dest;
}
int main()
{
int a[]={0,1,2,3,4,5,6,7,8,9};
mymemset(a,0,sizeof(a));
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}
memcpy函数
memcpy实现的是内存块之间的拷贝,注意memcpy也是逐字节进行内存之间拷贝的。
#include <iostream>
#include <cassert>
using namespace std;
void* memcpy(void* dest, void* src, int n)
{
assert(dest&&src);
char* pdest=(char*)dest;
char* psrc=(char*) src;
while(n--)
{
*pdest++=*psrc++;
}
return 0;
}
int main()
{
int a[6] = { 1,3,5,7,9,0 };
int b[10];
int n = sizeof(a) / sizeof(a[0]);
mymemcpy(b, a, sizeof(a));
for (int i = 0; i < n; i++)
{
cout << b[i] << endl;
}
return 0;
}