`
qiemengdao
  • 浏览: 272715 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

字符串函数汇总

 
阅读更多

面试中常常会要求写一些基本的库函数,尤其以字符串库函数考的最多,所以本文汇总了一些常见的字符串库函数的实现。此外,把与内存相关的操作函数也汇总到了一起。

//求字符串长度
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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics