标准库的string类提供了3个成员函数来从一个string得到c类型的字符数组:c_str()、data()、copy(p,n)。
1. c_str():生成一个const char*指针,指向以空字符终止的数组。
注:
①这个数组的数据是临时的,当有一个改变这些数据的成员函数被调用后,其中的数据就会失效。因此要么现用先转换,要么把它的数据复制到用户自己可以管理的内存中。注意。看下例:
const char* c;
string s="1234";
c = s.c_str();
cout<<c<<endl; //输出:1234
s="abcd";
cout<<c<<endl; //输出:abcd
上面如果继续用c指针的话,导致的错误将是不可想象的。就如:1234变为abcd
其实上面的c = s.c_str(); 不是一个好习惯。既然c指针指向的内容容易失效,我们就应该按照上面的方法,那怎么把数据复制出来呢?这就要用到strcpy等函数(推荐)。
string s = "1234";
char*c = new char[s.size() + 1];//char*c=new char[strlen(s.c_str())+1]; 注:string中length()和size()是一样的
//c = s.c_str();
strcpy(c, s.c_str());
cout << c << endl; //输出:1234
s = "abcd";
cout << c << endl; //输出:1234
② c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
2. data():与c_str()类似,但是返回的数组不以空字符终止。
3.size_type copy(CharT* dest, size_type count, size_type pos = 0);
Copies a substring[pos, pos + count) to character string pointed to by dest.If the requested substring lasts past the end of the string, or if count == npos, the copied substring is[pos,
size()).The resulting character string is not null - terminated.
If pos >= size(), std::out_of_range is thrown.
Parameters
dest pointer to the destination character string
pos position of the first character to include
count length of the substring
Return value
number of characters copied
size_t length;
char buffer[8];
string str("Test string......");
length = str.copy(buffer, 7, 6); //从buffer6,往后数7个,相当于[ buffer[6], buffer[6+7] ),length=7
buffer[length] = '\0'; //加上'\0'使得buffer就到buffer[length]为止;
cout << "buffer contains: " << buffer << endl; //tring..
length = str.copy(buffer, str.size(), 6); //从buffer6,往后数7个,length=11
//相当于[ buffer[6], buffer[6+7] )
buffer[length] = '\0'; //使得buffer就到buffer[length]为止;
cout << "buffer contains: " << buffer << endl;
length = str.copy(buffer, 7, 0); //相当于[ buffer[0], buffer[7] )
buffer[length] = '\0';
cout << "buffer contains: " << buffer << endl;
length = str.copy(buffer, 7); //缺省参数pos,默认pos=0;
//相当于[ buffer[0], buffer[7] )
buffer[length] = '\0';
cout << "buffer contains: " << buffer << endl;
length = str.copy(buffer, string::npos, 6); //相当于[ buffer[7], buffer[npos] )
//buffer越界赋值,没有出错
buffer[length] = '\0';
cout << string::npos << endl; //string::npos是4294967295
cout << buffer[string::npos] << endl; //实际是越界访问,但没有出错,输出空
cout << buffer[length - 1] << endl; //实际是越界访问,但没有出错,输出了其他字符
cout << "buffer contains: " << buffer << endl;
length = str.copy(buffer, string::npos); //相当于[ buffer[0], buffer[npos] )
//buffer越界赋值,没有出错
buffer[length] = '\0';
cout << "buffer contains: " << buffer << endl; //buffer越界
cout << buffer[string::npos] << endl; //越界访问,输出空
cout << buffer[length - 1] << endl; //越界访问,没有输出str最后一个字符,输出了其他字符。
//到这里提示:buffer corrupt!!