字符串函数汇总

本文汇总了常用的字符串库函数实现,包括字符串长度计算、拷贝、比较等,并介绍了与内存操作相关的函数如内存设置、复制及移动等。这些函数在面试和技术评估中经常被考察。

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

//求字符串长度
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 < d && s + n > d) {
		s += n;
		d += n;
		 while (--n >= 0)
			 *--d = *--s;
	} else {
		while (--n >= 0)
			*d++ = *s++;
	}
	return dst;
}


### 查找子串类 - **`find(str, beg=0, end=len(string))`**:查找字符串中的子串,若找到则返回索引值,否则返回 -1。 ```python str1 = "Runoob example...wow!!!" str2 = "exam" print(str1.find(str2)) ``` - **`index(str, beg=0, end=len(string))`**:与 `find` 类似,但如果子串不存在会抛出 `ValueError` 异常。 ```python str1 = "Runoob example...wow!!!" str2 = "exam" try: print(str1.index(str2)) except ValueError: print("子串未找到") ``` - **`rfind(str, beg=0, end=len(string))`**:从右边开始查找子串,返回子串最后一次出现的索引,若未找到返回 -1。 ```python str1 = "abca" str2 = "a" print(str1.rfind(str2)) ``` - **`rindex(str, beg=0, end=len(string))`**:从右边开始查找子串,返回子串最后一次出现的索引,若未找到抛出 `ValueError` 异常。 ```python str1 = "abca" str2 = "a" try: print(str1.rindex(str2)) except ValueError: print("子串未找到") ``` ### 字符串修改类 - **`replace(old, new [, max])`**:将字符串中的 `old` 替换成 `new`,如果 `max` 指定,则替换不超过 `max` 次。 ```python str1 = "hello world" print(str1.replace("world", "python")) ``` - **`strip([chars])`**:移除字符串首尾指定的字符(默认为空格)。 ```python str1 = " hello " print(str1.strip()) ``` - **`lstrip([chars])`**:移除字符串左边指定的字符(默认为空格)。 ```python str1 = " hello" print(str1.lstrip()) ``` - **`rstrip([chars])`**:移除字符串右边指定的字符(默认为空格)。 ```python str1 = "hello " print(str1.rstrip()) ``` ### 字符串分割与合并类 - **`split(sep=None, maxsplit=-1)`**:通过指定分隔符对字符串进行切片,并返回分割后的字符串列表。 ```python str1 = "hello,world,python" print(str1.split(",")) ``` - **`join(iterable)`**:将可迭代对象中的元素以指定字符串连接成一个新的字符串。 ```python list1 = ["hello", "world", "python"] print(" ".join(list1)) ``` ### 字符串大小写转换类 - **`upper()`**:将字符串中的小写字母转为大写字母。 ```python str1 = "hello" print(str1.upper()) ``` - **`lower()`**:将字符串中的大写字母转为小写字母。 ```python str1 = "HELLO" print(str1.lower()) ``` - **`capitalize()`**:将字符串的第一个字符转换为大写,其余字符转换为小写。 ```python str1 = "hello world" print(str1.capitalize()) ``` - **`title()`**:将字符串中每个单词的首字母转换为大写。 ```python str1 = "hello world" print(str1.title()) ``` ### 字符串填充与对齐类 - **`ljust(width[, fillchar])`**:返回一个原字符串左对齐,并使用 `fillchar` 填充至长度 `width` 的新字符串。 ```python str1 = "1999" print(str1.ljust(10, "$")) ``` - **`rjust(width[, fillchar])`**:返回一个原字符串右对齐,并使用 `fillchar` 填充至长度 `width` 的新字符串。 ```python str1 = "1999" print(str1.rjust(10, "$")) ``` - **`center(width[, fillchar])`**:返回一个原字符串居中,并使用 `fillchar` 填充至长度 `width` 的新字符串。 ```python str1 = "1999" print(str1.center(10, "$")) ``` - **`zfill(width)`**:返回指定长度的字符串,原字符串右对齐,前面填充 0。 ```python str1 = "1999" print(str1.zfill(10)) ``` ### 字符串判断类 - **`startswith(prefix[, start[, end]])`**:检查字符串是否以指定的前缀开始。 ```python str1 = "hello world" print(str1.startswith("hello")) ``` - **`endswith(suffix[, start[, end]])`**:检查字符串是否以指定的后缀结束。 ```python str1 = "hello world" print(str1.endswith("world")) ``` - **`isalnum()`**:如果字符串至少有一个字符并且所有字符都是字母或数字则返回 `True`,否则返回 `False`。 ```python str1 = "abc123" print(str1.isalnum()) ``` - **`isalpha()`**:如果字符串至少有一个字符并且所有字符都是字母则返回 `True`,否则返回 `False`。 ```python str1 = "abc" print(str1.isalpha()) ``` - **`isdigit()`**:如果字符串只包含数字则返回 `True`,否则返回 `False`。 ```python str1 = "123" print(str1.isdigit()) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值