c进阶篇(三):字符串函数

1.strlen:

strlen - C++ Reference

strlen 函数是一个标准库函数,用于计算以 null 结尾的字符串的长度,也就是字符串中实际字符的数量,不包括最后的 null 终止符 \0。它定义在 <string.h> 头文件中。

函数原型:size_t strlen(const char *str);

参数:str:指向以 null 结尾的字符串的指针。

返回值:返回一个 size_t 类型的值,表示字符串 str 中的字符数,不包括结尾的 null 字符。

使用示例:

模拟其实现代码如下:

size_t my_strlen1(const char *str) {
	int count = 0;
	assert(str != NULL);
	while (*str++) {
		count++;
	}
	return count;
}
size_t my_strlen2(const char* str) {
	assert(str != NULL);
	if (*str != '\0') {
		return 1 + my_strlen2(str+1);
	}
	else {
		return 0;
	}
}
size_t my_strlen3(const char* str) {
	assert(str != NULL);
	char* start = str;
	while (*str) {
		str++;
	}
	return str - start;
}

2.strcpy

strcpy - C++ Reference

函数原型:char *strcpy(char *dest, const char *src);

参数:dest:目标字符串的指针,它是一个指向足够大的字符数组或者字符指针,用于存储复制后的字符串。src:源字符串的指针,是一个指向以 null 结尾的字符串的指针,将被复制到目标字符串中。

返回值:返回指向目标字符串 dest 的指针,即复制后的字符串的起始地址。

使用示例:

模拟其实现代码如下:

char* my_strcpy(char* dest, const char* str) {
	char* ret = dest;
	assert(str && dest);
	while (*dest++ = *str++) {
		;
	}

	return ret;
}

注意事项:

  1. 目标字符串必须足够大dest 指向的内存空间必须足够大,能够容纳 src 指向的字符串及其结尾的 null 字符。否则可能会导致缓冲区溢出,产生未定义的行为。

  2. null 结尾符strcpy 函数会复制 src 指向的字符串直到遇到 null 结尾符为止。因此,复制的结果将会包括 null 结尾符。

  3. 安全性:使用 strcpy 函数时,应确保 src 指向的字符串确实以 null 结尾,否则可能会导致未定义的行为。

3.strcat

strcat - C++ Reference

strcat 函数用于将一个字符串追加到另一个字符串的末尾。它同样定义在 <string.h> 头文件中。

函数原型:char *strcat(char *dest, const char *src);

参数dest:目标字符串的指针,是一个以 null 结尾的字符数组或者字符指针,将被用作目标。

src:源字符串的指针,是一个以 null 结尾的字符数组或者字符指针,将被追加到目标字符串的末尾。

返回值:返回指向目标字符串 dest 的指针,即追加后的字符串的起始地址。

使用示例:

模拟其实现代码如下:

char* my_strcat(char* dest, const char* str) {
	assert(str&&dest);
	char* ret = dest;
	while (*dest) {
		dest++;
	}
	while (*dest++=*str++) {
		;
	}

	return ret;
}

注意事项

  1. 目标字符串必须足够大:与 strcpy 类似,dest 指向的内存空间必须足够大,能够容纳 src 指向的字符串及其结尾的 null 字符。否则可能会导致缓冲区溢出,产生未定义的行为。

  2. null 结尾符strcat 函数会在目标字符串 dest 的结尾 null 字符的位置开始追加 src 指向的字符串。因此,追加后的结果仍然以 null 结尾。

  3. 安全性:使用 strcat 函数时,应确保 dest 指向的目标字符串足够大,且确保 src 指向的字符串以 null 结尾

4.strcmp

strcmp - C++ Reference

strcmp 函数是用于比较两个字符串的内容是否相同。它同样定义在 <string.h> 头文件中。

函数原型:int strcmp(const char *str1, const char *str2);

参数:str1:要比较的第一个字符串的指针。str2:要比较的第二个字符串的指针。

返回值:如果 str1 和 str2 的内容相同,则返回值为 0。如果 str1 的内容大于 str2 的内容,则返回正值。如果 str1 的内容小于 str2 的内容,则返回负值。

使用示例:

模拟其实现代码如下:

int  my_strcmp(const char* str1, const char* str2) {
	assert(str1 && str2);
	
	while (*str1 == *str2) {
		str1++;
		str2++;
	}
	if (*str1 == "\0") {
		return 0;
	}
	return *str1 - *str2;
}

注意事项

  1. null 结尾符strcmp 函数会比较 str1str2 指向的字符串,直到遇到 null 结尾符为止。

  2. 大小写敏感strcmp 是区分大小写的,即大写字母和小写字母被视为不同的字符。

  3. 安全性:使用 strcmp 函数时,应确保 str1str2 都是以 null 结尾的有效字符串,否则可能会导致未定义的行为。

5.strstr

strstr - C++ Reference

strstr 函数用于在一个字符串中搜索指定子字符串的第一次出现,并返回一个指向该子字符串的指针。它同样定义在 <string.h> 头文件中。

函数原型:char *strstr(const char *haystack, const char *needle);

参数:haystack:要搜索的主字符串,即被搜索的字符串。needle:要查找的子字符串,即要搜索的目标字符串。

返回值:如果 needle 存在于 haystack 中,则返回一个指向 needle 在 haystack 中第一次出现的位置的指针。如果 needle 不存在于 haystack 中,则返回 NULL

使用示例:

模拟其实现代码如下:

char* my_strstr(const char*str1, const char* str2) {
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* p = str1;
	while(*p){
		s1 = p;
		s2 = str2;
		while (*s1 == *s2 && str1!='\0' && str2!='\0') {
			s1++;
			s2++;

		}	
		if (*s2 == '\0') {
			return p;
		}
		
		p++;
	}
	return NULL;
}


注意事项

  1. 大小写敏感strstr 函数是区分大小写的,即大写字母和小写字母被视为不同的字符。

  2. 空字符串:如果 needle 是一个空字符串 (""),则 strstr 函数将返回 haystack 的起始地址,因为任何字符串都包含空字符串。

  3. 安全性:确保 haystackneedle 都是以 null 结尾的有效字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值