0

下面的程序可以完美运行大多数输入,例如 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;
}
4

2 回答 2

2

总而言之,您的程序有两个错误:

1. 索引到一个空字符串

您索引到一个空字符串,p. 这可以覆盖任何东西,例如导致其他功能bad_alloc

您首先必须为字符串分配一些内存 - 例如,这将创建一个与 q 长度相同的字符串:

string p(q.size(), ' ');

或用于push_back创建字符串,就像使用vector.

2. 在字符串构造函数中使用非空终止字符*

push_back( p.data() )

p 是一个字符串, data 返回 a const char*,但在 C++11 之前它不是以 null 结尾的。要返回以空值结尾的数据,请使用c_str()

但是,因为p是 astring并且您想附加整个内容,您现在可以简单地说:

push_back( p )

即使您使用的是 C++11,这也是一个更好的解决方案。

于 2014-06-09T13:47:46.407 回答
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++ 让你拥有自由的函数,不受类斗争的影响。

于 2014-06-09T13:51:07.200 回答