c_str()函數返回一個指向正規C字符串的指針 const char*,內容就是string本身
C++中的這個函數是為了與c語言兼容,c中無string類型,故必須通過string類對象的成員函數c_str()把string對象轉換成c中的字符串樣式
#include<iostream> #include<cstring> using namespace std; int main(){ const char* c; string s="1234"; c=s.c_str();//直接在指針上操作 cout<<c<<endl; s="abcd"; cout<<c<<endl; return 0; }
結果:1234 abcd
這樣通過c指針進行操作,會是字符串發生改變。
#include<iostream> #include<cstring> using namespace std; int main(){ char *c=new char[20]; string s="1234"; strcpy(c,s.c_str());//通過strcpy()函數 頭文件#include<string.h>c里面的一個字符串復制的函數 返回char* cout<<c<<endl; s="abcd"; cout<<c<<endl; return 0; }
結果:1234 1234
通過strcpy()函數進行復制,之后的操作並不會改變字符串
c_str()返回的是一個臨時指針,不能對其進行操作,不需要手動釋放或刪除。
strcpy與strncpy的區別
第一種情況:
1
2
3
4
5
6
7
8
9
|
char
* p=
"how are you ?"
;
char
name[20]=
"ABCDEFGHIJKLMNOPQRS"
;
strcpy
(name,p);
//name改變為"how are you ? "====>正確!
strncpy
(name,p,
sizeof
(name));
//name改變為"how are you ?" =====>正確!后續的字符將置為NULL
|
第二種情況:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
char
* p=
"how are you ?"
;
char
name[10];
strcpy
(name,p);
//目標串長度小於源串,錯誤!
name[
sizeof
(name)-1]=
'\0'
;
//和上一步組合,彌補結果,但是這種做法並不可取,因為上一步出錯處理方式並不確定
strncpy
(name,p,
sizeof
(name));
//源串長度大於指定拷貝的長度sizeof(name),注意在這種情況下不會自動在目標串后面加'\0'
name[
sizeof
(name)-1]=
'\0'
;
//和上一步組合,彌補結果
|