【无标题】

strlen C语言源码实现

#include<stdio.h>
#include<assert.h>

typedef unsigned long ulong;

size_t stlen_c(const char* str)
{
	const char* char_ptr;
	const unsigned long int* longword_ptr;
	unsigned long int longword, himagic, lomagic;

	for (char_ptr = str; ((unsigned long int)char_ptr
		& (sizeof(longword) - 1)) != 0;
		++char_ptr)
		if (*char_ptr == '\0')
			return char_ptr - str;

	longword_ptr = (unsigned long int*)char_ptr;

	himagic = 0x80808080L;
	lomagic = 0x01010101L;

	if (sizeof(longword) > 4)
	{
		himagic = ((himagic << 16) << 16) | himagic;
		lomagic = ((lomagic << 16) << 16) | lomagic;

	}
	//if (sizeof(longword > 8)) //这个肯定是要写的
		//abort();  //C 库函数 void abort(void) 中止程序执行,直接从调用的地方跳出

	for (;;)
	{
		longword = *longword_ptr++;

		if (((longword - lomagic) & ~longword & himagic) != 0)
		{
			const char* cp = (const char*)(longword_ptr - 1);

			if (cp[0] == 0)
				return cp - str;
			if (cp[1] == 0)
				return cp - str + 1;
			if (cp[2] == 0)
				return cp - str + 2;
			if (cp[3] == 0)
				return cp - str + 3;
			if (sizeof(longword) > 4)
			{
				if (cp[4] == 0)
					return cp - str + 4;
				if (cp[5] == 0)
					return cp - str + 5;
				if (cp[6] == 0)
					return cp - str + 6;
				if (cp[7] == 0)
					return cp - str + 7;
			}
		}
	}

}

int main(void)
{
	//char* p = "string";
	int len = 0;
	len = stlen_c("string");
	printf("%d\n", len);

}

结语

for 循环中的longword 是每八个字节检查一次;前面已经char_ptr指针已经指向了8的倍数的地址,从这里开始,先强制类型转换,后面每8个字节检查一次。
[1]: https://blog.csdn.net/weixin_43476040/article/details/103245069?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-1-103245069-blog-125643497.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-1-103245069-blog-125643497.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值