5

検討

#include <string>
#include <iostream>

int main()
{
    /*
    hello
    5
    hel
    3
    */
    char a[] = "hello";
    std::cout << a << std::endl;
    std::cout << strlen(a) << std::endl;
    a[3] = 0;
    std::cout << a << std::endl;
    std::cout << strlen(a) << std::endl;

    /*
    hello
    5
    hel o
    5
    */
    std::string b = "hello";
    std::cout << b << std::endl;
    std::cout << b.length() << std::endl;
    b[3] = 0;
    std::cout << b << std::endl;
    std::cout << b.length() << std::endl;

    getchar();

}

配列 astd::stringと同じように動作すると思います。charつまり、文字列の途中にヌル文字を挿入すると、文字列が「終了」します。しかし、そうではありません。私の予想は間違っていますか?

4

5 に答える 5

9

Astd::stringは通常の C 文字列とは異なり、NUL 文字を問題なく含めることができます。ただし、これを行うと、.c_str()関数を使用して a を返すと、文字列が途中で終了することに気付くでしょうconst char *

于 2011-01-11T03:01:45.643 に答える
4

いいえ - std::strings は C の「文字列」のように NUL で終了しません。std::string はその長さを個別に記録します。

于 2011-01-11T03:01:15.457 に答える
2

@Louは正しいです:そうしないでください。代わりに、次のようにします。

b.erase (3, b.length());
于 2011-01-11T03:03:52.413 に答える
0

std::string は char 配列 a と同じように動作すると思います。

なんで?std::string に関係するドキュメントのどこにも、これを行うとは書かれていません。

私の提案は、C++ のように C に加えて何かを扱うのをやめることです。

于 2011-01-11T03:08:13.333 に答える
0

はい、あなたの期待は間違っています。 std::stringC 文字列とは異なることを意図しています (たとえば、必ずしも連続したメモリ/配列に格納されるとは限りません)。

最初のセクションの動作を再現するには、std::cout << b.c_str()代わりに を試してくださいstd::cout << b

于 2011-01-11T03:01:11.493 に答える