str系列函数的实现

通过代码实现str系列函数

strlen strcpy strcat strcmp
strncpy strncat strncmp
strstr strtok

1.strlen(字符串长度)

size_t myStrlen(const char* str) {
	assert(str != NULL);
	size_t size = 0;
	while (str[size] != '\0') {
		size++;
	}
	return size;
}

2.strcpy(字符串拷贝)
将src中的内容拷贝到dest里

char* myStrcpy(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	int i = 0;
	while (src[i] != '\0') {
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
	return dest;
}

3.strcat(字符串拼接)
将src中的内容拼接到dest后面

char* myStrcat(char* dest, const char* src) {
	assert(dest != NULL);
	assert(src != NULL);
	int destTail = 0;
	while (dest[destTail] != '\0') {
		destTail++;
	}
	//myStrcpy(dest + destTail, src);
	int i = 0;
	while (src[i] != '\0') {
		dest[destTail + i] = src[i];
		i++;
	}
	dest[destTail + i] = '\0';
	return dest;
} 

4.strcmp(比较字符串大小关系/是否相等)
strcmp(a,b)
a<b => <0的整数
a>b => >0的整数
a=b => 0

int myStrcmp(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	const char* p1 = str1;
	const char* p2 = str2;
	while (*p1 != '\0' && *p2 != '\0') {
		if (*p1 < *p2) {
			return -1;
		}
		else if (*p1 > *p2) {
			return 1;
		}
		else {
			p1++;
			p2++;
		}
	}
	/*if (*p1 < *p2) {
		return -1;
	}
	else if(*p1>*p2){
		return 1;
	}
	else {
		return 0;
	}*/
	return *p1 - *p2;
}

5.strncpy
将src所指向的字符串以src地址开始的
前num个字节拷贝到dest中去

char* myStrncpy(char* dest, char* src, size_t num) {
	assert(dest != NULL);
	assert(src != NULL);
	assert(num != 0);
	size_t i = 0;
	while (src[i] != '\0'&&i<num) {
		dest[i] = src[i];
		i++;
	}
	while (i < num) {
		dest[i] = '\0';
		i++;
	}
	return dest;
}

6.strncat
将src的前num个字节追加到dest后,会补\0

char* myStrncat(char* dest, const char* src, size_t num) {
	assert(dest != NULL);
	assert(src != NULL);
	assert(num != 0);
	size_t destTail = 0;
	while (dest[destTail] != '\0') {
		destTail++;
	}
	size_t i = 0;
	while (src[i] != '\0' && i < num) {
		dest[destTail + i] = src[i];
		i++;
	}
	dest[destTail + i] = '\0';
	return dest;
}

7.strncmp
比较str1和str2的前num个字节

int myStrncmp(const char* str1, const char* str2, size_t num) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	assert(num != 0);
	size_t i = 0;
	while (str1[i] != '\0' && str2[i] != '\0' && i < num) {
		if (str1[i] < str2[i]) {
			return -1;
		}
		else if (str1[i] > str2[i]) {
			return 1;
		}
		else {
			i++;
		}
	}
	if (i == num) {
		return 0;
	}
	return str1[i] - str2[i];
}

8.strstr
判定一个字符串是否包含另一个

const char* myStrstr(const char* str1, const char* str2) {
	assert(str1 != NULL);
	assert(str2 != NULL);
	assert(*str1 != '\0');
	assert(*str2 != '\0');

	const char* black = str1;
	while (*black != '\0') {
		const char* red = black;
		const char* sub = str2;
		while (*red!='\0'&&*sub!='\0'
			&&*red == *sub) {
			red++;
			sub++;
		}
		//以上循环结束,有3种可能
		//1.*red==\0 直接结束循环 进入下次
		//2.*sub==\0 找到了 返回black
		//3.*red!=*sub 直接进入下次循环
		/*if (*red == '\0' || *red == *sub) {
			black++;
			continue;
		}*/
		if (*sub == '\0') {
			return black; 
		}
		black++;
	}
	return NULL;
}

9.strtok(字符串切分)

int main() {
char str[] = "aaaa bbbb cccc dddd";
	char* pch = strtok(str, " ");
	while (pch != null) {
		printf("%s\n", pch);
		pch = strtok(null, " ");
	}
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值