面试中常常会要求写一些基本的库函数,尤其以字符串库函数考的最多,所以本文汇总了一些常见的字符串库函数的实现。此外,把与内存相关的操作函数也汇总到了一起。
- //求字符串长度
- int strlen(const char *s) {
- int n = 0;
- while (*s++ != '\0')
- n++;
- return n;
- }
- //字符串拷贝,返回指针是为了实现链式操作,如strlen(strcpy(dst, src)),dst需要保证有足够空间
- char *strcpy(char *dst, const char *src) {
- assert(dst != NULL && src != NULL); //拷贝空串无意义
- char *ret = dst;
- while ((*dst++ = *src++) != '\0')
- ;
- return ret;
- }
- //字符串比较,p>q则返回整数,p=q返回0,否则返回负数
- int strcmp(const char *p, const char *q) {
- while (*p && *p == *q)
- p++, q++;
- return (int) ((unsigned char) *p - (unsigned char) *q);
- }
- // 找到字符c在字符串s中首次出现的位置
- char *strchr(const char *s, char c) {
- for (; *s; s++)
- if (*s == c)
- return (char *) s;
- return NULL;
- }
- //拼接字符串,注意这里dst需要保证有足够的空间
- char *strcat(char *dst, const char *src) {
- char *d = dst;
- while (*d)
- d++;
- while ((*d = *src) != '\0')
- ;
- return dst;
- }
- //设置内存位置v开始的n个元素值为c
- void *memset(void *v, int c, size_t n) {
- char *p = v;
- int m = n;
- while (--m >= 0) {
- *p++ = c;
- }
- return v;
- }
- //内存拷贝,注意这里不考虑内存覆盖的情况
- void *memcpy(void *dst, const void *src, size_t n) {
- char *d = dst;
- const char *s = src;
- while (n--)
- *d++ = *s++;
- return dst;
- }
- //内存拷贝函数更健壮的版本,可以处理内存覆盖的情况
- void *memmove(void *dst, const void *src, int n) {
- char *d = dst;
- const char *s = src;
- if (s + n > d) {
- s += n;
- d += n;
- while (--n >= 0)
- *--d = *--s;
- } else {
- while (--n >= 0)
- *d++ = *s++;
- }
- return dst;
- }