C语言strlen函数的缺陷与实现,strcpy函数的缺陷与实现,strcat函数的缺陷与实现,strcmp的实现。

1.strlen

函数原型:

size_t strlen( const char *string );
  • size_t 是无符号整型,相当于unsigned int
  • const char *string 是目标字符串

函数作用: 计算字符串的长度。

函数的模拟实现:

size_t _strlen(const char * str) {
	assert(str);
	int count = 0;
	while (*str) {
		count++;
		str++;
	}
	return count;
}

strlen函数的缺陷: 函数返回值是 size_t 所以有时候会发生一些意想不到的结果。

#include <stdio.h>
#include <string.h>
int main() {
	int i = -1;
	char str[] = "abcd";
	if (strlen(str) > i) {
		printf("YES\n");
	}
	else {
		printf("NO\n");
	}
	
	return 0;
}

以上这段代码 strlen 算出来结果很明显是 4 ,用 4i变量 去进行比较,那结果肯定是输出 YES。但是由于 strlen 返回的是无符号整数,所以这里会发生算术转换(自动类型转换),那么算术转换就会把 -1 转换为无符号整数,-1 的补码是全 1 转换成无符号数是一个非常大的整数。所以最后的结果是 NO

在这里插入图片描述


2.strcpy

函数原型:

char *strcpy( char *strDestination, const char *strSource );
  • char *strDestination 是目标字符串的起始地址
  • const char *strSource 是源字符串(需要拷贝过去的字符串)
  • char *strcpy 拷贝结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用: 拷贝字符串。

函数的模拟实现:

char* _strcpy(
	char * dest, 
	const char * src
) {
	assert(dest && src);

	char* temp = dest;

	while (*dest++ = *src++);

	return temp;
}

strcpy函数的缺陷:

1.strcpy拷贝的时候会拷贝 '\0',所以源字符串中必须有 '\0',如果没有'\0'会造成strcpy越界访问。
2.目标字符串的空间必须要比源字符串的空间大,否则会造成程序异常崩溃。


3.strcat

函数原型:

char *strcat( char *strDestination, const char *strSource );
  • char *strDestination 是目标字符串的起始地址
  • const char *strSource 是源字符串(需要追加上去字符串)
  • char *strcat 追加结束后,返回目标字符串的起始地址,方便函数的链式访问

函数作用: 追加字符串。

函数的模拟实现:

char* _strcat(
	char* dest,
	const char* src
) {
	assert(dest && src);

	char* temp = dest;

	while (*dest) {
		dest++;
	}

	while (*dest++ = *src++);

	return temp;
}

strcat函数的缺陷:

1.strcat追加的时候会追加 '\0',所以源字符串中必须有 '\0',如果没有'\0'会造成strcat越界访问。
2.目标字符串中也要有'\0',因为strcat是从目标字符串'\0'的位置开始追加。
3.目标字符串的空间必须要比源字符串的空间大,否则会造成程序异常崩溃。
4.strcat不可以追加同一个字符串。


4.strcmp

函数原型:

int strcmp( const char *string1, const char *string2 );
  • const char *string1 是第一个字符串的起始地址

  • const char *string2 是第二个字符串的起始地址

  • int strcmp 返回一个整型

    • > 0 说明第一个字符串大于第二个字符串
    • < 0 说明第一个字符串小于第二个字符串
    • = 0 说明两个字符串相等

函数作用: 判断字符串是否相等。

函数的模拟实现:

int _strcmp(
	const char* string1, 
	const char* string2
) {
	assert(string1 && string2);
	while ( (*string1 == *string2) && (*string1) && (*string2) ) {
		string1++;
		string2++;
	}

	return *string1 - *string2;
}

int main() {

	char str1[] = "abcdf";
	char str2[] = "abcdf";
	printf("%d" , _strcmp(str1 , str2));

	return 0;
}

在这里插入图片描述

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值