Definition:
1.char *是一个指针(指向一个字符串数组),这个数组可以在栈上分配,也可以在堆上分配。
2.string可以被看成是以字符为元素的一种容器,字符构成序列(字符串)。标准的string类提供了STL容器接口,比如begin()、end(),迭代器可以根据他们进行定位。
char*效率比string高,使用string的时候一定要注意构造和拷贝以及析构带来的性能开销,尽可能的减少构造,能使用引用的地方尽量用引用,减少不必要的构造。
string 与char*转换:
1 2 3 |
string s1 = "ramsey"; const char *k = s1.c_str(); const char *t = s1.data(); |
注意:只能转换成const char*,如果去掉const编译不能通过。具体可以查看stl的内部实现<xstring.h>:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
const _Elem *c_str() const { // return pointer to null-terminated nonmutable array return (_Myptr()); } const _Elem *data() const { // return pointer to nonmutable array return (c_str()); } const _Elem *_Myptr() const { // determine current pointer to buffer for nonmutable string return (this->_BUF_SIZE <= this->_Myres ? this->_Bx._Ptr : this->_Bx._Buf); } |
当前我们需要将xx.txt提取出姓名xx,
1 2 3 4 5 6 7 |
string s1 ="xx.txt"; s1 = s1.substr(0, s1.rfind(".")); char* name1; int leng = s1.length(); name1 = (char *)malloc((leng+1)*sizeof(char)); s1.copy(name1, leng, 0); name1[leng] = '\0';//char *补零 |
血的教训:注意string 转char*的时候内存开辟必须是
1 |
name1 = (char *)malloc((leng+1)*sizeof(char)); |
而不是
1 |
name1 = (char *)malloc(leng*sizeof(char)); |
这个BUG极其容易被忽视!!!
char*与string 转换:
char* name="ramsey"; 注意:char*会在结尾添加’\0’作为结束符。
string s1=name; 注意:这边只是将name的首地址传给s1。
int len=sizeof(name) 输出len为4,即char*指针的长度。
char ss='s'; int i1=sizeof(ss); char的长度为1(x86)。
如何统计name的长度(一个英文字符占1个ascii码,中文字符占2个ascii码)
1 2 3 4 5 |
int strl(char *s){ int i,k=0; for(i=0;s[i];i++)k++; //finde s[i]=’\0’ return k; } |
当前我们需要将char*中的内容(输入姓名)转换到一个新定义的string中,同时采用stl string的"+"操作符在路径"D:\\database\\"创建txt。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
string fileDir = "D:\\database\\"; int len=strl(name); for(int i=0;i<len;i++) fileDir+=name[i]; fileDir+=".txt"; const char *path = fileDir.data(); //typedef basic_ofstream<char, char_traits<char> > ofstream; //#incldue<fstream> ofstream fout( path ); if ( fout ) { fout.close(); return 1; } else { return -1; } |
内存管理:
string的内存管理是由系统处,其内部自己实现内存的申请与释放。不易出错。
char *的内存管理由用户自己处理,很容易出现内存不足的问题。
string缺点是其内部申请的内存要大于你要使用的内存,原因是便于数据的动态扩展,并且不同容器对内存的管理策略也不尽相同。完成同样的一个任务可能会有多种方式,在不了解内部实现的情况下,不一定能够使用最有效率的方法完成任务。
所以,在已知大小的情况下使用char*或char[]比较好,在效率和内存使用上。
在未知长度,并且总体上并不会占用很多内存,对效率要求不高,或者没有限制内存与效率的情况下使用string。