[面试备忘]常用库函数实现

题目:常用库函数实现。

 1 #include <iostream>
2 #include <cassert>
3 void* myMemCpy(void* dest, const void* src, size_t length)
4 {
5 assert(dest && src);
6 char* charDest = static_cast<char*>(dest);
7 const char* charSrc = static_cast<const char*>(src);
8 bool special = charSrc < charDest && static_cast<size_t>(charDest - charSrc) < length;
9 for (size_t index = 0; index != length; ++index) {
10 size_t step = special ? (length - 1 - index) : index;
11 *(charDest + step) = *(charSrc + step);
12 }
13 return dest;
14 }
15
16 size_t myStrlen(const char* str)
17 {
18 assert(str);
19 size_t result = 0;
20 while (*str++ != 0) {
21 ++result;
22 }
23 return result;
24 }
25
26
27 char* myStrNCpy(char* dest, const char* src, size_t length)
28 {
29 assert(dest && src);
30 size_t cpLength = length > myStrlen(src) ? myStrlen(src) : length;
31 myMemCpy(dest, src, length);
32 for (size_t index = 0; index != length - cpLength; ++index) {
33 dest[cpLength + index] = 0;
34 }
35 return dest;
36 }
37
38 char* myStrCpy(char* dest, const char* src)
39 {
40 return myStrNCpy(dest, src, myStrlen(src) + 1);
41 }
42
43 char* myStrCatN(char* dest, const char* src, size_t length)
44 {
45 assert(dest && src);
46 size_t destLen = myStrlen(dest);
47 return myStrNCpy(dest + destLen, src, length) - destLen;
48 }
49
50 char* myStrCat(char* dest, const char* src)
51 {
52 return myStrCatN(dest, src, myStrlen(src) + 1);
53 }
54
55 int myStrCmp(const char* pre, const char* post)
56 {
57 assert(pre && post);
58 while (*pre != 0 || *post != 0) {
59 if (*pre > *post) {
60 return 1;
61 } else if (*pre < *post) {
62 return -1;
63 }
64 ++pre;
65 ++post;
66 }
67 return 0;
68 }
69
70
71 int main()
72 {
73 char testArrayA[] = "1234567890";
74 char testArrayB[] = "123";
75 char* testArrayC = new char[25];
76 std::cout << myStrCpy(testArrayC, testArrayA) << std::endl;
77 std::cout << myStrCat(testArrayC, testArrayB) << std::endl;
78 std::cout << myStrCatN(testArrayC, testArrayB, 2) << std::endl;
79 std::cout << myStrCatN(testArrayC, testArrayB, 5) << std::endl;
80 std::cout << myStrCmp(testArrayA, testArrayA) << std::endl;
81 std::cout << myStrNCpy(testArrayA, testArrayB, 5) << std::endl;
82 std::cout << static_cast<char*>(myMemCpy(testArrayA + 1, testArrayA, 9)) << std::endl;
83 std::cout << myStrlen(testArrayA) << ' ' << myStrlen("\0") << ' ' << myStrlen("a") << std::endl;
84 return 0;
85 }

  

转载于:https://www.cnblogs.com/lifengzhong/archive/2011/08/26/2154212.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值