以下程序适用于大多数输入,如123210122。
但是当我输入为12221112222221112221111111112221111时,它会抛出std :: bad_alloc异常。
我无法更改问题中指定的类结构或函数签名。所以看看这段代码:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class BinaryCode
{
public:
vector<string> decode(string q)
{
string p;
int i;
vector<string> response;
bool flagnone=false;
p[0]='0';
p[1]=((q[0]-'0')-0-(p[0]-'0'))+'0';
if(p[1]!='0' && p[1]!='1')
response.push_back("NONE");
else
{
for(i=2;i<q.length();++i)
{
p[i]=((q[i-1]-'0')-(p[i-2]-'0')-(p[i-1]-'0'))+'0';
if(p[i]!='0' && p[i]!='1')
{
response.push_back("NONE");
flagnone=true;
}
}
if(!flagnone)
{
response.push_back(p.data());
}
}
flagnone=false;
p[0]='1';
p[1]=((q[0]-'0')-0-(p[0]-'0'))+'0';
if(p[1]!='0' && p[1]!='1')
response.push_back("NONE");
else
{
for(i=2;i<q.length();++i)
{
p[i]=((q[i-1]-'0')-(p[i-2]-'0')-(p[i-1]-'0'))+'0';
if(p[i]!='0' && p[i]!='1')
{
response.push_back("NONE");
flagnone=true;
}
}
if(!flagnone)
{
response.push_back(p.data());
}
}
return response;
}
}b;
int main()
{
string s;
cin>>s;
vector<string>ans = b.decode(s);
cout<<ans[0]<<" "<<ans[1];
return 0;
}
答案 0 :(得分:2)
总结一下,你的程序有两个错误:
您索引为空字符串p
。这可能会覆盖任何内容,例如导致其他函数bad_alloc
。
首先必须为字符串分配一些内存 - 例如这将创建一个与q:
相同长度的字符串string p(q.size(), ' ');
或使用push_back
创建字符串,就像使用vector
一样。
push_back( p.data() )
p是一个字符串,数据返回const char*
,但在C ++ 11之前它不会被空终止。要返回以null结尾的数据,请使用c_str()
但是,因为p
是string
并且您想要附加整体,所以您现在可以直接说出来:
push_back( p )
即使您使用的是C ++ 11,这也是一个更好的解决方案。
答案 1 :(得分:0)
我不确定这些是否都是问题所在,但它们是跳出来的。
string p;
这会创建一个空字符串。它有零(0)个元素。
p[0]='0';
在这里,您可以分配空字符串p
的第一个元素
这是未定义的。
这意味着您的整个程序无效,任何事情都可能发生。
p[1]=((q[0]-'0')-0-(p[0]-'0'))+'0';
如果p
没有为空,未定义,则相当于
p[1] = q[0];
弄清楚为什么留下来作为练习。
并且
response.push_back(p.data());
可以替换为
response.push_back(p);
创建类BinaryCode
及其实例时也没有任何意义,因为它没有状态。
C ++让你拥有免费的功能,不受课堂斗争的影响。