一、三者的基本概念
string:
string可以被看成是以字符为元素的一种容器,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),可使用迭代器。
与char*不同的是,string不一定以NULL(‘\0’)结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。
char*:
char *是一个指针,指向一个字符串数组。
声明:char *cstr = new char[10];
char* 的值(指向)是可以改变的,但char*只能指向(字符串)常量,指向的区域的内容不可改变;
char[]:
是一个字符数组,数组内的内容是可以改变的。作为函数的声明的参数的时候,char []是被当做char *来处理的!两种形参声明写法完全等效!
举例:
char *test=” hello world!”的内容是不可以改的;char test[15]=” hello world!”的内容是可以改的。
二、相互转换
1、string转char*
std::string str = "string";
const char *cstr = str.c_str();
这时,得到的是一个const char*,他是一个常量,如果需要得到char*,需要以下的操作:
std::string str = "string";
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
// do stuff
delete [] cstr;
2、char*转string
可以直接赋值。
char *cstr = “hello”;
string sss;
sss = cstr;
不过这种方式会出现情况。
当我们定义了一个string类型之后,用printf(“%s”,s1);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型。所以肯定出错。
用cout输出是没有问题的,若一定要printf输出。那么可以这样:
printf(“%s”,sss.c_str());
3、 char[] 转 string
同上。
4、string 转 char[]
string sss = "hello";
char ppp[6];
int i;
for( i=0;i<sss.length();i++)
ppp[i] = sss[i];
ppp[i] = '\0';
cout<<ppp;