1

私はこの少し奇妙なコードを書きました。その2の間でどのようにtype変化する可能性がありますprintfか??

前もって感謝します

int main()
{
    string label = string("faults_team_A_player_12");

    size_t f = label.find('_');

    const char *type = label.substr(0,f).c_str();
    const char team = label.at(f+sizeof("team_"));

    printf("type = %s\n",type);

    int n;
    size_t l = label.length()-label.find_last_of('_');

    int x = sscanf((char *)label.substr(label.find_last_of('_'),l).c_str(),"_%d",&n);
    printf("type = %s\n",type);
    printf("team = %c\n",team);
    printf("player = %d\n",n);

    return 0;
}

出力:

type = faults
type = _12
team = A
player = 12
4

3 に答える 3

4

type一時インスタンスの内部メンバーに初期化されるため、ダングリング ポインターです。std::string

const char *type = label.substr(0,f).c_str();

std::string結果が取得されるインスタンスは、c_str()すぐに破棄されます。

于 2012-12-07T15:55:26.320 に答える
3
const char *type = label.substr(0,f).c_str();

ポインターtypeは、一時 ( label.substr(0,f)) 内のデータの一部を参照します。そのポインターの使用は未定義の動作です。

于 2012-12-07T15:55:29.793 に答える
0

std::stringを呼び出して のバッファへのポインタを.c_str()取得すると、バッファは取得されません。たとえば、文字列オブジェクトがスコープ外になると、ポインターは無効になります。

于 2012-12-07T15:56:23.590 に答える