今天在做题中遇到的
错误代码
#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容器。