123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #include <stdio.h>
- /**
- * 自行实现strlen函数
- * @param s 字符串指针
- * @return 字符串的长度
- */
- size_t strlen_diy(const char *s) {
- const char *a = s;
- while (*s++)
- ;
- return s - a - 1;
- }
- /**
- * 自行实现memchr函数
- * @param src 源数据指针
- * @param c 要查找的字符
- * @param n 检查的字符数
- * @return 找到字符的指针,或NULL
- */
- void *memchr_diy(const void *src, int c, size_t n) {
- const unsigned char *s = src;
- c = (unsigned char)c;
- for (; n && *s != c; s++, n--)
- ;
- return n ? (void *)s : 0;
- }
- /**
- * 自行实现strnlen函数
- * @param s 字符串指针
- * @param n 最大检查长度
- * @return 字符串的实际长度,或n
- */
- size_t strnlen_diy(const char *s, size_t n) {
- const char *p = memchr_diy(s, 0, n);
- return p ? p - s : n;
- }
- /**
- * 自行实现strcpy函数
- * @param d 目标字符串指针
- * @param s 源字符串指针
- * @return 目标字符串指针
- */
- char *strcpy_diy(char *d, const char *s) {
- char *p = d;
- // for (; (*d = *s); s++, d++) ;
- while ((*d++ = *s++))
- ;
- return p;
- }
- /**
- * 自行实现strcat函数
- * @param d 目标字符串指针
- * @param s 源字符串指针
- * @return 目标字符串指针
- */
- char *strcat_diy(char *d, const char *s) {
- strcpy_diy(d + strlen_diy(d), s);
- return d;
- }
- int main() {
- char str[] = "Hello World -> (strlen_diy memchr_diy strcpy_diy strcat_diy)";
- // 使用memchr_diy查找字符'('的位置
- puts(memchr_diy(str, '(', strlen_diy(str)));
- // 使用strlen_diy计算字符串长度
- int len = strlen_diy(str);
- printf("len: %d\n", len);
- // 使用strnlen_diy计算字符串长度,限制最大检查长度为100
- len = strnlen_diy(str, 100);
- printf("len: %d\n", len);
- // 使用strcpy_diy复制字符串
- char *s = strcpy_diy(str, "Hello C/C++ LIBC:");
- printf("%s\n", s);
- // 使用strcat_diy追加字符串
- s = strcat_diy(str, "-> strcat_diy");
- printf("%s\n", s);
- return 0;
- }
|