STL中string中c_str(),data(),copy()

C++字符串转换详解
本文详细介绍了C++标准库中的string类提供的三种方法用于将string类型转换为C风格的字符数组,包括c_str()、data()及copy()函数的使用方式与注意事项。

标准库的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!!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值