1. ホーム
  2. C++

C++ 文字列における c_str(), data(), copy(p,n) 関数の使用法

2022-02-11 04:30:46
<パス

1. c_str():ヌル文字で終端する配列への const char* ポインタを生成する。
引用元: csqlwy - ブログランド
リンク www.cnblogs.com/qlwy/archive/2012/03/25/2416937.html(末尾をクリックすると元記事が読めます)to go

1) c_str()は文字列へのポインタしか返さないので、今使って最初に変換するか、そのデータをユーザが管理できるメモリにコピーしてください。

int main()
{
    const char* c;
    string s = "1234";
    c = s.c_str();
    cout<<c<<endl; //output: 1234
    s = "abcd";
    cout<<c<<endl; //output: abcd
    return 0;
}

int main()
{
    char* c=new char[20];
    string s="1234";
    //c = s.c_str();
    strcpy(c,s.c_str());
    cout<<c<<endl; //output: 1234
    s="abcd";
    cout<<c<<endl; //output: 1234
    return 0;
}



strcpyなどの関数を使って、必要なデータを別のメモリにコピーすれば、独立したデータになりますね。(推奨)です。

int main( )
{
    using namespace std;
    string str1 ( "1234567890" );
    basic_string <char>::iterator str_Iter;
    char array1 [ 20 ] = { 0 };
    char array2 [ 10 ] = { 0 };
    basic_string <char>:: pointer array1Ptr = array1;
    basic_string <char>:: value_type *array2Ptr = array2;

    cout << "The original string str1 is: ";
    for ( str_Iter = str1.begin( ); str_Iter ! = str1.end( ); str_Iter++ )
        cout << *str_Iter;
    cout << endl;

    basic_string <char>:: size_type nArray1;
    // Note: string::copy is potentially unsafe, consider
    // using string::_Copy_s instead.
    nArray1 = str1.copy ( array1Ptr , 12 ); // C4996
    cout << "The number of copied characters in array1 is: "
        << nArray1 << endl;
    cout << "The copied characters array1 is: " << array1Ptr << endl;

    basic_string <char>:: size_type nArray2;
    // Note: string::copy is potentially unsafe, consider
    // using string::_Copy_s instead.
    nArray2 = str1.copy ( array2Ptr , 5 , 2 ); // C4996
    cout << "The number of copied characters in array2 is: "
        << nArray2 << endl;
    cout << "The copied characters array2 is: " << array2Ptr << endl;

}


<イグ
c_str()は、クライアントプログラムが読み取り可能な、文字の配列への変更不可能なポインタを返し、手動でポインタを解放または削除する必要はありません。

data():c_str()と似ているが、返される配列はヌル文字で終端しない。

3. copy(p,n,size_type _Off = 0) : 文字列型のオブジェクトから、文字ポインタ p が指す空間に最大 n 文字をコピーします。デフォルトでは最初の文字から始めますが、どこから始めるかを指定することもできます (0 から始めることを忘れないでください)。オブジェクトからコピーされた実際の文字が返されます。ユーザは、p が指す空間が n 文字を保持するのに十分であることを確認する。
(サイズタイプ _Off で開始し、p に n 文字を代入する)

int main( )
{
    using namespace std;
    string str1 ( "1234567890" );
    basic_string <char>::iterator str_Iter;
    char array1 [ 20 ] = { 0 };
    char array2 [ 10 ] = { 0 };
    basic_string <char>:: pointer array1Ptr = array1;
    basic_string <char>:: value_type *array2Ptr = array2;

    cout << "The original string str1 is: ";
    for ( str_Iter = str1.begin( ); str_Iter ! = str1.end( ); str_Iter++ )
        cout << *str_Iter;
    cout << endl;

    basic_string <char>:: size_type nArray1;
    // Note: string::copy is potentially unsafe, consider
    // using string::_Copy_s instead.
    nArray1 = str1.copy ( array1Ptr , 12 ); // C4996
    cout << "The number of copied characters in array1 is: "
        << nArray1 << endl;
    cout << "The copied characters array1 is: " << array1Ptr << endl;

    basic_string <char>:: size_type nArray2;
    // Note: string::copy is potentially unsafe, consider
    // using string::_Copy_s instead.
    nArray2 = str1.copy ( array2Ptr , 5 , 2 ); // C4996
    cout << "The number of copied characters in array2 is: "
        << nArray2 << endl;
    cout << "The copied characters array2 is: " << array2Ptr << endl;

}


<イグ