string未能成功赋值的原因

今天在做题中遇到的

 错误代码

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=100010;
int main()
{
	string P,I,p;
	int t;
	cin>>t;
	for(int v=1;v<=t;v++)
	{
		cin>>I>>P;
		int j=0,k=0,sum=0;
		
		
		//cout<<p;
		for(int i=0;i<P.size();i++)
		{
			if(I[j]!=P[i]) 
			{
				P[i]='.';
				sum++;
				continue;
			}
			else
			{
				p[k]=P[i];
                k++;
				j++;
			}
	
		}
		

        //cout<<P<<"  "<<p<<endl;

		if(I.compare(p)==0)
		{
			printf("Case #%d: %d",v,sum);
			printf("\n");
		}
		else
		{
			printf("Case #%d: IMPOSSIBLE",v);
			printf("\n");
		}
	}
	return 0;
}

自己调试了好久,发现在输出时直接跳过p数组,p数组输出时没用任何东西,然后我就改,刚开始以为是我赋值出错的原因,然后把else后面的内容用for循环遍历赋值,发现还是没变化,就意识到是string p;定义时出了问题,然后查了资料才知道

我在创建`new_p`字符串时没有分配足够的空间,当你尝试给每个字符串赋值时,其实是在访问一个未分配内存的位置,这会导致未定义的行为。在C++中,字符串对象是动态分配的,并且其大小是根据需要自动调整的。可以使用`push_back()`函数向字符串末尾添加字符,字符串对象会自动扩展以容纳新的字符,并确保内存分配正确。
更正:将`new_p`初始化为空字符串并使用`push_back()`函数向字符串末尾添加字符。

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=100010;
int main()
{
	string P,I,p;
	int t;
	cin>>t;
	for(int v=1;v<=t;v++)
	{
		cin>>I>>P;
		int j=0,k=0,sum=0;
		p="";  //初始化为空
		
		
		//cout<<p;
		for(int i=0;i<P.size();i++)
		{
			if(I[j]!=P[i]) 
			{
				P[i]='.';
				sum++;
				continue;
			}
			else
			{
				p.push_back(P[i]); //插入元素
				//p[k]=P[i];
				//k++;
				j++;
			}
	
		}
		
		if(I.compare(p)==0)
		{
			printf("Case #%d: %d",v,sum);
			printf("\n");
		}
		else
		{
			printf("Case #%d: IMPOSSIBLE",v);
			printf("\n");
		}
	}
	return 0;
}

emmm其实还是不特别理解,下一期,我查好资料会详细讲一下C++中string容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值