標(biāo)準(zhǔn)庫(kù)的string類提供了3個(gè)成員函數(shù)來(lái)從一個(gè)string得到c類型的字符數(shù)組:c_str()、data()、copy(p,n)。
c語(yǔ)言strcpy()用法
這是C語(yǔ)言里面復(fù)制字符串的庫(kù)函數(shù), 函數(shù)聲明包括在專門處理字符串的頭文件《string.h》中:
char * strcpy( char * dst, const char * src );
這個(gè)函數(shù)把字符串src復(fù)制到一分配好的字符串空間dst中,復(fù)制的時(shí)候包括標(biāo)志字符串結(jié)尾的空字符一起復(fù)制。操作成功,返回dst,否則返回NULL.
你要注意,你的第二個(gè)字符串src的長(zhǎng)度+1(+1是因?yàn)樽址钥兆臃Y(jié)束)不能超過(guò)你為dst開辟的空間的大小,否則src里的空字符無(wú)法復(fù)制到dst里面,你的dst就成了字符數(shù)組,不是字符串了,那樣如果你后面有一條printf或者puts語(yǔ)句什么的,要打印出dst的,那就會(huì)由于沒(méi)有空字符標(biāo)志字符串的結(jié)束而越界了。
例如:
定義一個(gè)字符串char a[20],和一個(gè)字符串c[]=“i am a teacher!”;
把c復(fù)制到a中就可以這樣用:strcpy(a,c);
這個(gè)函數(shù)包含在頭文件 《string.h》中。
程序代碼:
#include《string.h》
#include《iostream.h》
void main()
{char a[20],c[]=“i am teacher!”;
strcpy(a,c);
cout《《a《《endl;
}
你看好了:
char a[20] = “abcde”
strcpy(&a[1], a)函數(shù)是逐個(gè)字符拷貝,
首先拷貝第一個(gè)字符,a[0] == ‘a(chǎn)’;a[1] = a[0]; 即a[1] = ‘a(chǎn)’;
然后拷貝第二個(gè)字符,此時(shí)a[1] == ‘a(chǎn)’; a[2] = a[1];即a[2] = ‘a(chǎn)’;
依次類推?。?!a[0] = ‘a(chǎn)’沒(méi)什么用,其實(shí)初始a[0]就等于‘a(chǎn)’的!
copy(p,n,size_type _Off = 0):從string類型對(duì)象中至多復(fù)制n個(gè)字符到字符指針p指向的空間中。默認(rèn)從首字符開始,但是也可以指定,開始的位置(記住從0開始)。返回真正從對(duì)象中復(fù)制的字符。------用戶要確保p指向的空間足夠保存n個(gè)字符。
// 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); //錯(cuò)誤?。。。?/p>
//cout《《“The number of copied characters in array3 is: ”
// 《《nArray3《《endl;
//cout《《“The copied characters array3 is: ”《《array3Ptr《《endl;
}
上面最后注釋掉的部分,雖然編譯沒(méi)有錯(cuò)誤,但是運(yùn)行時(shí)會(huì)產(chǎn)生錯(cuò)誤:Stack around the variable ‘a(chǎn)rray3’ was corrupted.
評(píng)論
查看更多