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

题目:常用库函数实现。

 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 }

  

posted @ 2011-08-26 11:47  lifengzhong  阅读(208)  评论(0编辑  收藏  举报