0

次の switch ステートメントを使用すると、非常に奇妙な動作が発生します。

string recognise_mti(int mti_code)
{
switch(mti_code)
    {
    case 1100:
    case 1101:
        return (mti_code + " (Auth. Request/Repeat)"); break;

    default:
        return (mti_code + " (NOT RECOGNISED)"); break;
    }
}

入力整数に応じて、あらゆる種類のものを返すようです。ばかげた間違いになる可能性がありますが、まだ認識できません。どんな助けにも感謝します。

4

7 に答える 7

10

mti_codeでも" (Auth. Request/Repeat)"ありませんstd::string。したがって、実際には、その追加が行うのはポインタの追加だけです。したがって、最終的にはややランダムな(そしておそらく無効な)ポインタになり、それが暗黙的にに変換されstd::stringます。

これを試して:

#include <sstream>

...

std::stringstream ss;
ss << mti_code;
switch(mti_code)
    {
    case 1100:
    case 1101:
        ss << " (Auth. Request/Repeat)"; break;

    default:
        ss << " (NOT RECOGNISED)"; break;
    }
return ss.str();
于 2012-06-25T14:42:52.020 に答える
4

整数と文字列リテラルを追加しています。これは、C++コードでは一般的ではありません。

リテラルは1100文字よりも(ずっと)短いため、無効な文字ポインタから作成された文字列を返している可能性があります。

于 2012-06-25T14:42:48.353 に答える
2

C スタイルの文字列に整数を追加しようとしていますが、期待どおりに動作しません。文字列は最初の文字へのポインターに変換され、そのポインターは文字列の末尾から 1100 (またはその他の) バイトずつインクリメントされ、ランダム メモリに格納されます。運が良ければ、プログラムはクラッシュします。運が悪いと、関数はガベージを返します。

文字列ストリームを使用して文字列を構築できます。

std::ostringstream result;
switch(mti_code)
{
case 1100:
case 1101:
    result << mti_code << " (Auth. Request/Repeat)"; break;

default:
    result << mti_code << " (NOT RECOGNISED)"; break;
}
return result.str();

std::to_stringまたは C++11 では、整数を変換するために使用できます。

return std::to_string(mti_code) + " (Auth. Request/Repeat)";
于 2012-06-25T14:45:44.453 に答える
2

文字列を整数に追加しようとしています。これは、C または C++ では不可能です。何らかの方法で整数を文字列に変換する必要があります。これstd::ostringstreamが推奨される方法です。

std::string recognise_mti(const int mti_code)
{
    std::ostringstream ostr;

    switch(mti_code)
    {
    case 1100:
    case 1101:
        ostr << mti_code << " (Auth. Request/Repeat)";
        break;

    default:
        ostr << mti_code << " (NOT RECOGNISED)";
        break;
    }

    return ostr.str();
}

または、C++11 をサポートするコンパイラがあり、std::to_stringそれを使用できる場合:

std::string recognise_mti(const int mti_code)
{
    switch(mti_code)
    {
    case 1100:
    case 1101:
        return std::to_string(mti_code) + " (Auth. Request/Repeat)";

    default:
        return std::to_string(mti_code) + " (NOT RECOGNISED)";
    }
}
于 2012-06-25T14:46:24.587 に答える
1

指定された文字列リテラルの最初のバイトのアドレスに整数値を追加していることがわかりますか? これは基本的に未定義の動作です。たとえば、「右」に 1100 のオフセットを作成しているためです (文字について話しているため、メモリ通りの 1100 バイト下にあるもののアドレスです)。たとえば、私の例で、指定された文字列リテラルのアドレスを 1100 オフセットしようとすると、「初期化中」となります。これは、オフセット アドレスが返され、指定されたアドレスにあるものとして読み取られる文字列に暗黙的に変換されるためです。

私の例の文字列、「クレイジーな象」、または MSVC で完全な C++11 サポートを有効にする秘密の方法など、何でもかまいません。:P

もう 1 文字 (1 バイト、右に 1 オフセット) オフセットしようとすると、次のようになります。

recognise_mti(1100);  // "being initialized."  
recognise_mti(1101); // "eing initialized."
于 2012-06-25T14:51:45.240 に答える
0

整数と文字列リテラルを。で連結することはできません+。最初に整数を文字列に変換する必要があります。stringstreamこれは、またはを使用して行うことができますsprintf()

于 2012-06-25T14:42:56.880 に答える
0

にを追加intし、const char*それをとして返しstringます。

于 2012-06-25T14:43:01.667 に答える