strcpy 实现

简单,但超级常考!!!!!!!!

  实现一个C语言的标准库函数:字符串拷贝 char* strcpy(char* dest, const char* src);
  strcpy 把含有 ‘\0’ 结束符的字符串复制到另一个地址空间,返回值的类型为char*。

  注意:src 和 dest 所指内存区域不可以重叠且 dest 必须有足够的空间来容纳 src 的字符串。
  实现如下:

char* strcpy(char* des, const char* source) {
	assert((des != nullptr) && (source != nullptr));
	char* r = des;
	while((*r++ = *source++) != '\0');
	return des;
}

  对于出现异常的情况 ANSI-C99 标准并未定义,故由实现者决定返回值,通常为NULL。实际调用如下:

#include <iostream>
#include <cassert>
using namespace std;

char* string_copy(char* des, const char* source) {
	assert((des != nullptr) && (source != nullptr));
	//cout << sizeof(des) << " " << sizeof(source) << endl;	// 4 4 (32位下指针大小)
	char* r = des;
	while ((*r++ = *source++) != '\0');
	return des;
}

int main() {
	char a[10] = "abcde", b[6];	// b 大小要 >= 6, 不然会崩
	//cout << sizeof(b) <<" "<< sizeof(a) << endl;	// 6 10
	string_copy(b, a);
	cout << b << endl;	// abcde
}

要注意的点

1、为什么要返回 char*

  返回 strDest 的原始值使函数能够支持链式表达式,也就是可以 int iLength=strlen(strcpy(strA,strB)); 或者 char * strA=strcpy(new char[10],strB);

2、怎么保证传入的 char* 内存是够的?

  因为传入的是字符数组,数组名自动转换为指针类型,strlen 的话,也只能输出一个很奇怪的数,因为 strlen 遇到 ‘\0’ 才停;sizeof 也因为转换为指针了,会输出 4。所以没有想到什么好的办法判断,望赐教。
  上边的例子,因为字符串默认最后会添加 ‘\0’,所以 b数组至少要 6 的大小,否则会崩。

发布了191 篇原创文章 · 获赞 111 · 访问量 68万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览