C++ 的 std::string 有什么缺点? - 知乎
C++之string类型详解 - 百度文库
1 - string是char的定义
string:
string是C++标准库(STL)中的类型,是一个类,定义在 < string > 头文件中。里面包含了对字符串的各种常用操作,它较 char* 的优势是内容可以动态拓展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作。
char*:
char* 是一个指向字符的指针,是一个内置类型。可以指向一个字符,也可以表示字符数组的首地址(首字符的地址)。我们更多的时候是用的它的第二的功能,来表示一个字符串,功能与字符串数组char ch[n]一样,表示字符串时,最后有一个 '\0’结束符作为字符串的结束标志。
2 - 区别
研究区别首先要看一下char、char*、与string分别属于的指针、数组、对象。从这三个类型基本就可以看出区别在哪里。
char *s1; //s1是指向字符串的指针
char s2[1]; //s2是字符类型的一维数组
string s3; //s3是string类的对象
区别:
(1)char*与char[]
1 - char *a
a是一个指向已知字符串的指针,实质是指针。
2 - char arr[]
arr本身是一个字符串数组,arr指向该数组的第一个元素,实质是数组。
3 - char*a 与char arr[]
[1] 赋值区别
char s1[5];
char *s2;
s1 = "abcd"; //error
s2 = "abcd"; //correct
//s1是数组的名字,当成是常量指针,不可以作为左值修改。
//s2是一个指针变量,可以将其指向一个字符串常量
//使用char*定义字符串,不能改变字符串内的字符的内容,但却可以把另外一个字符串付给它
//使用char[]可以改变字符的内容
[2]大小区别
char str[] = {"abcd"},sizeof(str) = 5,strlen(str) = 4
char *str = {"abcd"}, sizeof(str) = 4,strlen = 4
[3]转换方法
- 把char arr[]赋值给char *a
很简单:
char arr[]={"qwer"};
char *a=arr;
- 把char* 赋值给char arr[]
需要通过循环来一个一个地赋值
(2)char和string
1 - 定义和赋值
//char
char ch1[30],ch2[30];
cin>>ch1;
ch2=ch1; //错误(报错:char表达式必须是可修改的左值),即只有在定义时char数组可以用“=”
//可以使用strcpy来进行赋值
char ch3[] = "give me";
char ch4[] = "a cup";
strcpy(ch3,ch4);
cout<<"ch3="<>str1;
str2=str1; //正确,string类型可以使用“=”
string str3 = "give me";
string str4 = "a cup";
str3.assign(str4,0,5); // 第2个参数“0”为起始位置,第3个参数“5”为字符数
cout<<"str3="<
3 - 转换
C++中char类型可以自动转换成string类型,即可以用char类型字符串直接给string类型变量赋值
(1)char >>> string
//1
//直接初始化 string s(char *)
char ch [] = "abc";
string str(ch);//也可string str = ch;
//2
char c;
string str;
stringstream stream;
stream << c;
str = stream.str();
//3
char ch [] = "abc";
string str;
str = ch; //在原有基础上添加可以用str += ch;
如下例子:
//3-1
using namespace std;
#include
#include
int main() {
int len; //字符个数
cin >> len;
char *arr = new char[len];
int idx = 0;
while (idx != len) {
cin >> arr[idx++];
}
string str = "";
for (int i = 0; i < len; ++i) {
str += ar[i];
}
cout << str << endl;
return 0;
}
/*终端显示
输入:3 a b c
输出:abc
*/
(2)string >>> char
//1
//使用data()函数
string str = "abc";
char* p = (char*) str.data();
//2
//c_str()
char c[20];
string s="1234";
strcpy(c,s.c_str());
//2-1
//C++中风格,因为C++中认为strcpy不安全,所有可以使用strcpy_s
string s="1234";
len = sizeof(s) + 1;
char *c = new char[len];
strcpy_s(c,sizeof(s)+1,s.c_str());
// 2 - 这里的strcpy可以使用吗
//2-2
string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"
//3
//copy()函数
char buf[10];
string str("ABCDEFG");
length = str.copy(buf, 9);
buf[length] = '\0';
(3)PS:
[1] - 关于c_str()
语法:
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针
比如:
//错误
char* c;
string s="1234";
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
//正确
char c[20];
string s="1234";
strcpy(c,s.c_str()); //c_str()返回的是一个临时指针,不能对其进行操作,所以cp到变量c中
//2 - 这里的原理可以去研究下
[2] 在C++中无法使用strcpy函数
注意,在C++中无法使用strcpy函数,它被认为是不安全的;
strcpy_s函数需要输入三个参数;
参数1,存放复制的字符串,类型为char *;
参数2,被复制的字符串的个数;
参数3,被复制的字符串,类型为char *;
因为参数3类型为char *,需要用到c_str()函数进行转换
using namespace std;
#include
#include
int main() {
string str;
cin >> str;
int len = str.size() + 1;
char *arr = new char[len];
//注意这里创建char数组时,无法使用变量创建,即下列格式错误
//char arr[len]; 原因是数组的数量len需要是一个常量
strcpy_s(arr, len, str.c_str());
for (int i = 0; i < (len - 1); ++i) {
cout << arr[i];
}
cout << endl;
return 0;
}
/*终端显示
输入:abc
输出:abc
*/