-1

このコードは、コメントを外した場合にのみ機能します

//else return "null"; 

9行目ですが、それは私が必要とするものではありません。その行を次のように置き換えてみました

else continue;

しかし、それもうまくいきません。「currentCommand」は C スタイルの文字列です。

std::string Parser::dest(){
//Determines whether C-command has a dest mnemonic
bool hasDest = false;
for (int i=0; i<strlen(currentCommand); i++){
    if (currentCommand[i] == '='){
        hasDest = true;
        break;
    }
    //else return "null";
}

if (hasDest == false) return "null";

std::string destm;
char temp;
int index = 0;
temp = currentCommand[index];
while (temp !=  '='){
    destm += temp;
    index++;
}   
return destm;
}

この関数を呼び出すと出力が得られるはずでしたが、コメントを外すと得られ//else return "null"ます..しかし、必要な出力ではありません。しかし、その行をコメントのままにしておくと、出力が得られず、しばらくすると次のエラーが表示されます。

「std::bad_alloc」のインスタンスをスローした後に呼び出される終了

what(): std::bad_alloc

1Aborted (コアダンプ)

4

5 に答える 5

3
temp = currentCommand[index];
while (temp !=  '='){
    destm += temp;
    index++;
}

その while ループで「一時」を変更するものは何もありません....ある時点で bad_alloc が発生することは驚くことではありません。多分

while ((temp = currentCommand[index++]) != '=') {
    destm += temp;
}
于 2013-07-18T20:34:56.850 に答える
1

最初の文字が "=" でない場合、'else' ステートメントはすぐに関数を終了します。あなたが本当に意図したのは、「for ループ全体で「=」が見つからなかった場合は、else ステートメントを実行する」ということです。したがって、「else」は for ループの後にある必要があります。しかし、代わりにそれを中に挿入しました。したがって、コードは次のように言っています。最初の文字が「=」でない場合は、ただ終了してください。

しかし、心配しないでください。ループの後の行は、if (hasDest==false)必要なことを正確に実行するので、else にコメントしてもまったく問題ありません。とにかく間違っていました。

もう1つ、英語の「null」という文字列ではなく、(void*)0として定義された定数としてNULLを返す必要があります。そうしないと、関数のスタックに char 配列を割り当ててそのポインターを返すため、エラーが発生する可能性がありますが、この配列は関数の終了時に破棄されます。

于 2013-07-18T20:34:29.363 に答える
0

実際には、forループはまったく問題ではありません。(ただし、 のような既存の関数を使用することはまだ良い考えかもしれませんstrchr。)

これは問題を引き起こしているコードです:

std::string destm;
char temp;
int index = 0;
temp = currentCommand[index];
while (temp != '=') {
    destm += temp;
    index++;
}

文字列の最初の文字が何であれ設定tempしますが、while ループでは実際に の値を変更することはありませんtemp。あなたdestmは成長し続け、メモリがなくなるまで の初期値をtemp何度も追加します (これが を取得している理由を説明していますbad_alloc)。

于 2013-07-18T20:44:18.667 に答える