Who are you?

string类字符访问成员函数

这一部分的内容主要是用于对自定义程序输入或输出文件名这一部分内容做一个进一步的学习,但是不会涉及很多内容,只涉及c_str()data()copy(p,n)这三个字符访问成员函数。其他关于string类的成员函数内容可以参见维基百科)。

c_str()data()copy(p,n)这三个字符访问成员函数都可以从一个string类对象得到一个C类型的字符数组。

c_str()

作用:返回对应于字符串内容的 C 风格零结尾的只读字符串,实现机制是生成一个const char*指针,并指向数组。

示例:

1
2
3
4
5
6
7
8
9
10
11
#include<string>
...
const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:abcd
...

注意

  • c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针

  • 如上例,这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。因此要么现用先转换,要么把它的数据复制到用户自己可以管理的内存中。

  • 其实上面的c = s.c_str();不是一个好习惯。既然c指针指向的内容容易失效,我们就应该按照上面的方法,那怎么把数据复制出来呢?这就要用到strcpy()等函数(推荐)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include<string>
    ...
    //const char* c; //声明指向常量的指针,其指向的内容不能通过指针改变,但是指针可以指向其他变量
    //char* c; //未初始化
    char* c=new char[20];
    string s="1234";
    strcpy(c,s.c_str());
    cout<<c<<endl; //输出:1234
    s="abcd";
    cout<<c<<endl; //输出:1234
    ...

data()

作用:访问基础数组,C++11 后与 c_str() 完全相同

copy()

作用:copy(p,n,size_type _Off = 0)-从string类型对象中至多复制n个字符到字符指针p指向的空间中。默认从首字符开始,但是也可以指定,开始的位置(记住从0开始)。返回真正从对象中复制的字符。用户要确保p指向的空间足够保存n个字符,否则有溢出危险。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// basic_string_copy.cpp
// compile with: /EHsc /W3
#include <string>
#include <iostream>
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 , 6 ); // C4996
cout << "The number of copied characters in array2 is: "
<< nArray2 << endl;
cout << "The copied characters array2 is: " << array2Ptr << endl;
////注意一定要使array3有足够的空间
//char array3[5]={0};
//basic_string<char>::pointer array3Ptr=array3;
//basic_string<char>::size_type nArray3;
//nArray3 = str1.copy(array3,9); //错误!!!!
//cout<<"The number of copied characters in array3 is: "
// <<nArray3<<endl;
//cout<<"The copied characters array3 is: "<<array3Ptr<<endl;
}

参考: