手写strlen

#include<iostream>
#include<cassert>
using namespace std;

int strlen1(const char* src)
{
	assert(src != NULL);
	int len = 0;
	while (*src++ != '\0')
		len++;
	return len;
}

int strlen2(const char* src)
{
	assert(src != NULL);
	const char* temp = src;
	while (*src++ != '\0');
	return  src - temp - 1;

}


int main()
{
	char p[] = "Hello";
	cout << "use strlen1:" <<strlen1(p) <<endl;
	cout << "use strlen2:" <<strlen2(p)<< endl;
    return 0;
}

以上是strl的两种方法,第二种效率比第一种高,因为每次循环只需要一次自增,而前者需要两次。
while (*src++ != ‘\0’);
return src - temp - 1;
开始对这个有一些疑问,调试就可以发现
在这里插入图片描述
在这里插入图片描述

跳出循环之后,temp的指向是0x0136fa60,而src的指向是0x0136fa66. 所以最后算字符串长度的时候要减一。
这种先判断在自增的,过程大概是先判断H e l l o都不等于’\0’,这时候的地址已经到了0x0136fa64,然后src再往后走一个到了’\0’,地址0x0136fa65,然后判断了==’\0’就跳出循环,这时候再自增,就到了0x0136fa66.

这样写可能容易理解一些
while (*src != ‘\0’)
{
src++;
}
return src - temp;

这个就不用减一了

下面是一个简单的手写字符串实现,可以用来存储和操作字符串: ```c++ #include <iostream> class String { public: // 构造函数 String() { length = 0; data = new char[length + 1]; data[0] = '\0'; } String(const char* str) { length = strlen(str); data = new char[length + 1]; strcpy(data, str); } // 拷贝构造函数 String(const String& other) { length = other.length; data = new char[length + 1]; strcpy(data, other.data); } // 析构函数 ~String() { delete[] data; } // 重载赋值运算符 String& operator=(const String& other) { if (this != &other) { delete[] data; length = other.length; data = new char[length + 1]; strcpy(data, other.data); } return *this; } // 重载下标运算符 char& operator[](int index) { return data[index]; } const char& operator[](int index) const { return data[index]; } // 获取长度 int getLength() const { return length; } // 获取字符串 const char* getData() const { return data; } private: int length; char* data; }; int main() { String str1("Hello"); String str2 = str1; String str3; str3 = str2; std::cout << str1.getData() << std::endl; std::cout << str2.getData() << std::endl; std::cout << str3.getData() << std::endl; str2[0] = 'h'; std::cout << str2.getData() << std::endl; return 0; } ``` 上面这个实现只是一个简单的示例,实际上字符串的实现非常复杂,还需要考虑内存分配、动态扩容、编码方式等问题。在实际开发中,我们通常会使用标准库提供的字符串类(如 C++ 中的 std::string)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值