memchr_strlen_diy.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <stdio.h>
  2. /**
  3. * 自行实现strlen函数
  4. * @param s 字符串指针
  5. * @return 字符串的长度
  6. */
  7. size_t strlen_diy(const char *s) {
  8. const char *a = s;
  9. while (*s++)
  10. ;
  11. return s - a - 1;
  12. }
  13. /**
  14. * 自行实现memchr函数
  15. * @param src 源数据指针
  16. * @param c 要查找的字符
  17. * @param n 检查的字符数
  18. * @return 找到字符的指针,或NULL
  19. */
  20. void *memchr_diy(const void *src, int c, size_t n) {
  21. const unsigned char *s = src;
  22. c = (unsigned char)c;
  23. for (; n && *s != c; s++, n--)
  24. ;
  25. return n ? (void *)s : 0;
  26. }
  27. /**
  28. * 自行实现strnlen函数
  29. * @param s 字符串指针
  30. * @param n 最大检查长度
  31. * @return 字符串的实际长度,或n
  32. */
  33. size_t strnlen_diy(const char *s, size_t n) {
  34. const char *p = memchr_diy(s, 0, n);
  35. return p ? p - s : n;
  36. }
  37. /**
  38. * 自行实现strcpy函数
  39. * @param d 目标字符串指针
  40. * @param s 源字符串指针
  41. * @return 目标字符串指针
  42. */
  43. char *strcpy_diy(char *d, const char *s) {
  44. char *p = d;
  45. // for (; (*d = *s); s++, d++) ;
  46. while ((*d++ = *s++))
  47. ;
  48. return p;
  49. }
  50. /**
  51. * 自行实现strcat函数
  52. * @param d 目标字符串指针
  53. * @param s 源字符串指针
  54. * @return 目标字符串指针
  55. */
  56. char *strcat_diy(char *d, const char *s) {
  57. strcpy_diy(d + strlen_diy(d), s);
  58. return d;
  59. }
  60. int main() {
  61. char str[] = "Hello World -> (strlen_diy memchr_diy strcpy_diy strcat_diy)";
  62. // 使用memchr_diy查找字符'('的位置
  63. puts(memchr_diy(str, '(', strlen_diy(str)));
  64. // 使用strlen_diy计算字符串长度
  65. int len = strlen_diy(str);
  66. printf("len: %d\n", len);
  67. // 使用strnlen_diy计算字符串长度,限制最大检查长度为100
  68. len = strnlen_diy(str, 100);
  69. printf("len: %d\n", len);
  70. // 使用strcpy_diy复制字符串
  71. char *s = strcpy_diy(str, "Hello C/C++ LIBC:");
  72. printf("%s\n", s);
  73. // 使用strcat_diy追加字符串
  74. s = strcat_diy(str, "-> strcat_diy");
  75. printf("%s\n", s);
  76. return 0;
  77. }