阿里的电面要我用C/C++实现一个字符串拷贝的函数,虽然以前写过 strcpy 的函数实现,但时间过去很久了,再加上有点紧张,突然就措手不及了。最后写是写出来了,但没考虑异常的情况,面试官好像很不满意。(T_T),写篇文章记录一下,以免日后重蹈覆辙。
一、字符串拷贝strcpy
函数strcpy的原型是char*
strcpy(char* des , const char* src),des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。
#include <assert.h>
#include <stdio.h>
char* strcpy(char* des, const char* src)
{
assert((des!=NULL) && (src!=NULL));
char *address = des;
while((*des++ = *src++) != ' ')
;
return address;
}
要知道 strcpy 会拷贝' ',还有要注意:
-
源指针所指的字符串内容是不能修改的,因此应该声明为 const 类型。
-
要判断源指针和目的指针为空的情况,思维要严谨,这里使用
assert(见文末)。 -
要用一个临时变量保存目的串的首地址,最后返回这个首地址。
-
函数返回 char* 的目的是为了支持链式表达式,即strcpy可以作为其他函数的实参。
二、字符串长度strlen
函数strlen的原型是size_t
strlen(const char *s),其中 size_t 就是 unsigned int。
#include <assert.h>
#include <stdio.h>
int strlen(const char* str)
{
assert(str != NULL);
int len = 0;
while((*str++) != ' ')
++len;
return len;
}
strlen 与 sizeof 的区别:
-
sizeof是运算符,strlen是库函数。
-
sizeof可以用类型、变量做参数,而strlen只能用 char* 变量做参数,且必须以