0

strstr() を使用して、文字列内の部分文字列を見つけようとしています。char[] の使用のみが機能し、char* は機能せず、セグメンテーション エラーが発生します。

したがって、これは機能しています:

int main() {
    char str[] = "apple apple peach";
    char *p;

    p = strstr(str, "peach");
    if (p!= NULL) {
        strncpy(p, "apple", 5);
    }
    return 0;
}

しかし、これは機能していません:

int main() {
    char *str = "apple apple peach";
    char *p;

    p = strstr(str, "peach");
    if (p!= NULL) {
        strncpy(p, "apple", 5);
    }
    return 0;
}

これはどちらでもありません:

int main() {
    char *str = "apple apple peach";
    char *peach = "peach";
    char *p;

    p = strstr(str, peach);
    if (p!= NULL) {
        strncpy(p, "apple", 5);
    }
    return 0;
}

そして、これも:

int main() {
    char *str = "apple apple peach";
    char peach[] = "peach";
    char *p;

    p = strstr(str, peach);
    if (p!= NULL) {
        strncpy(p, "apple", 5);
    }
    return 0;
}

それは既知のバグまたは機能ですか?

4

3 に答える 3

3

string-literalは安全に変更できません! のものは、 string-literal自体はなく、 string- literalのコピーされたバージョンを変更したchar[]ためにのみ成功しました。標準の関連する段落は次のとおりです。strncpy(p, "apple", 5);

6.4.5、パラグラフ6

...次に、マルチバイト文字シーケンスを使用して、シーケンスを格納するのに十分な長さの静的ストレージ期間の配列を初期化します...

6.4.5、パラグラフ7

... プログラムがそのような配列を変更しようとした場合、動作は未定義です。

要するに、string-literal は(概念的に)配列に置き換えられており、これを変更するのは安全ではありません。string-literalは必ずしも const 修飾されているわけではありませんが、MSVC++ では string-literal または const 修飾されているものを義務付けているようですconst char *

于 2016-11-06T10:10:06.610 に答える