0

以下のプログラムは、123210122 のようなほとんどの入力に対して完全に実行されます。

しかし、122211122222111222111111112221111 として入力すると、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

要約すると、プログラムにある 2 つのエラーは次のとおりです。

1.空の文字列へのインデックス付け

空の文字列 にインデックスを付けますp。それは何かを上書きする可能性がありbad_alloc、たとえば他の機能を引き起こす可能性があります。

最初に文字列にメモリを割り当てる必要があります。たとえば、これにより q と同じ長さの文字列が作成されます。

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

またはpush_back、 で行ったように、文字列を作成するために使用しますvector

2. 文字列コンストラクターで null で終了しない char* を使用する

push_back( p.data() )

p は文字列で、データは aconst char*を返しますが、C++11 より前では null で終了していません。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 に答える