c_str()関数は、文字列C正規CONSTのchar *へのポインタへのポインタを返し、コンテンツは文字列そのものであります
C言語との互換性のためのC ++関数は、何C文字列型は、それが文字列パターンC、c_strストリングクラスのオブジェクトのメンバー関数により文字列にオブジェクトを変換する必要はありません()
#include <iostreamの> する#include <CStringの> 使用して 名前空間STD; int型のmain(){ CONST チャー * C; 文字列 S = " 1234 " ; C = s.c_str(); //上の直接のポインタ COUT << C << てendl; S = " ABCD " 。 coutの << C << てendl; リターン 0 ; }
結果:1234 ABCD
Cによって操作そのようなポインタは、文字列が変更されてもよいです。
#include <iostreamの> する#include <CStringの> 使用して 名前空間STD; int型のmain(){ チャー * = C 新しい新しい チャー [ 20である]; 文字列 S = " 1234 " ; strcpyの(C、s.c_str()); //によって文字列関数のstrcpy()関数ヘッダは、<string.hの>リターン*チャー内部複製cを#includeし COUT << C << ENDLと、 S = " ABCD " 。 coutの << C << てendl; リターン 0 ; }
結果:12341234
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'
;
//和上一步组合,弥补结果
|