string模拟中出现的死循环

本文探讨了在C++ string类中使用insert方法时出现死循环的问题,重点在于理解end变量类型转换的陷阱,并提供了两种修复方案:类型转换为int和改进后的代码实现。通过调整end的定义和避免类型提升,确保了代码的正确运行。
摘要由CSDN通过智能技术生成

项目场景:

string类中insert的模拟实现

问题描述:

当我用下面这种方法进行插入的时候,会出现一个死循环,

	string& insert(size_t pos, char ch)
		{
			assert(pos <= _size);
			if (_size == _capacity)
				reserve(_capacity==0?4:_capacity*2);
				size_t end = _size;
			while (end >= pos)
			{
				if (end == 0)
				{
					cout << end << endl;
				}
			_str[end + 1] = _str[end];
			--end;
			}
			_str[++end] = ch;
			_size++;
			return *this;
		}
	void testinsert()
	{
		string s1("hello world");
		s1.insert(0, 'z');
		cout << s1.c_str() << endl;
	}

原因分析:

1.因为在函数insert中,end是用size_t定义的,所以当end–直到0 的时候,赋值后会再进行一次-- ,那么end变为-1,而end是一个无符号型的类型,所以,-1即为最大值(4294967290),所以会一直循环下去。
2.即使将end定义为是int的类型,C代码在遇到不同数据类型不一致的情况下,会自动进行类型提升。也就是说en还是会被提升成size_t,类型提升的规则如下:

如果两种类型字节数不同,则转换成字节数高的类型。
如果两种类型字节数相同,但一种有符号,一种无符号,则转换成无符号类型
所有浮点都是以双精度类型进行的,即使只含有单精度运算的表达式,也要先转换成double型,再作运算。

解决方案:

1.将end改为int,并且将pos强制转换成int;
2.换一种写法,如下:

string& insert(size_t pos, char ch)
		{
			assert(pos <= _size);
			if (_size == _capacity)
				reserve(_capacity==0?4:_capacity*2);
			size_t end = _size+1;//从后往前插的时候,end的开始位置是最后一个元素的'\0'后一位,这样代码写起来比较方便
			while (end >pos)
			{
				_str[end] = _str[end-1];
				end--;
			}
			_str[++end] = ch;
			_size++;
			return *this;
			}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

年轻人江老Der

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值