C语言字符串操作函数 strcpy, strncpy, memcpy, memset, strcat, strlen ...

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实现C/C++中的字符串操作函数是很练内功的,别看着这些函数很简单,自己实现起来,还是有许多地方需要考虑的,所以没独立写过的朋友,可以自己敲敲看 . --By Crazybaby

strcpy:

[cpp]view plaincopyprint?

1.char* cb_strcpy(char* dst, const char* src) {

2.

3. assert((dst!=NULL) && (src!=NULL));

4.

5.char* retAddr = dst; /**< retAddr is in static , char retAd

dr[] will in Stack, So... */

6. while ((*(dst++) = *(src++))!='\0') {

7. ;

8. }

9.

10. return retAddr;

11.}

strncpy:

[cpp]view plaincopyprint?

1.char* cb_strncpy(char* dst, const char* src, size_t size) {

2.

3. assert((dst!=NULL) && (src!=NULL));

4.

5.char* retAddr = dst; /**< retAddr is in static , char retAd

dr[] will in Stack, So... */

6.int i = 0;

7. while (((*(dst++) = *(src++))!='\0') && ((i++) < size)) {

8. ;

9. }

10.

11. *(retAddr+size)='\0'; /**< cut off String */

12.

13. return retAddr;

14.}

这个strncpy实现版本和stdlib.h 下的strncpy 还是有区别的, 比如

[cpp]view plaincopyprint?

1.char a[30];

2.strncpy(a, "Hello", 28); //a除了有Hello,之后会有23个repeat '\0' . 这样

会有效率的问题.

3.

4.char b[30];

5.cb_strncpy(b, "Hello", 28); // 而只有 Hello'\0'

CB: strncpy相对于strcpy来说,安全性提高了一个等级 . 另外一个要非常注意的地方那个是strcpy 和strncpy 都会遇到'\0' 结束.

另外:当请求的目标地址空间比源字符串空间要小的时候,strncpy 将不再用”\0”来结束字符串。这是一个巨大的隐患,所以还是不安全

memcpy Version 1:

[cpp]view plaincopyprint?

1.char* cb_memcpyVer1(char* dst, const char* src, size_t size) {

2.

3. assert((dst!=NULL) && (src!=NULL));

4.

5.char* retAddr = dst;

6. while (size-- > 0) {

7. *(dst++) = *(src++);

8. }

9. return retAddr;

10.}

CB: memcpy 和strncpy 最大的区别是memcpy不会遇到'\0' 结束拷贝 .

memcpy Version 2 :

[cpp]view plaincopyprint?

1.char* cb_memcpyVer2(char* dst, const char* src, size_t size) {

2.

3. assert((dst!=NULL) && (src!=NULL));

4.

5.char* retAddr = dst;

6.size_t i = 0;

7. /* --- 解决数据区重叠问题 --- */

8. if ((retAddr>src) && (retAddr<(src+size))) {

9. for (i=size-1; i>=0; i--) {

10. *(dst++) = *(src++);

11. }

12. }

13. else

14. {

15. for (i=0; i

16. *(dst++) = *(src++);

17. }

18. }

19. *(retAddr+size)='\0';

20.

21. return retAddr;

22.}

CB: memcpyVersion1不能防止overlapping区域的问题, Ver2很好的解决了. memcpy还有种蛋疼的写法:

[cpp]view plaincopyprint?

1.void* cb_memcpy(void* dest, const void* src, size_t count)

2.{

3.char* d = (char*)dest;

4. const char* s = (const char*)src;

5. /* --- 每次复制8bit --- */

6.int n = (count + 7) / 8;

相关文档
最新文档