需要包含头文件和命名空间
#include<string>
using namespace std;
目录
0.困惑点
关于在C++中 #include<string.h> 和 #include<cstring> 和 #include<string> 的区别?
结论:如果想要定义string,那么必须写上 using namespace std 和 #include <string>。
如果想要使用strcat等函数就加上<cstring>或者<string.h>
详细解释可看:https://blog.csdn.net/weixin_42513339/article/details/89208031
strcat函数用法可看:https://blog.csdn.net/u013162035/article/details/78612407
PS:对于<string>和另外两个没有关系,不要混淆。
1. 声明
string str;
string类的构造函数和析构函数如下:
1) string s; // 生成一个空字符串s
2) string s(str) ; // 拷贝构造函数生成str的复制品
3) string s(str, stridx); // 将字符串str内"始于位置stridx"的部分当作字符串的初值
4) string s(str, stridx, strlen) ; // 将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值
5) string s(cstr) ; // 将C字符串(以NULL结束)作为s的初值
6) string s(chars, chars_len) ; // 将C字符串前chars_len个字符作为字符串s的初值。
7) string s(num, ‘c’) ; // 生成一个字符串,包含num个c字符
8) string s(“value”); string s=“value”; // 将s初始化为一个字符串字面值副本
9) string s(begin, end); // 以区间begin/end(不包含end)内的字符作为字符串s的初值
10) s.~string(); //销毁所有字符,释放内存
2.string与C字符数组的比较
string串要取得其中某一个字符,和传统的C字符串一样,可以用s[i]的方式取得。比较不一样的是如果s有三个字符,传统C的字符串的s[3]是’\0’字符,但是C++的string则是只到s[2]这个字符而已。
2.1、C风格字符串
- 用”“括起来的字符串常量,C++中的字符串常量由编译器在末尾添加一个空字符;
- 末尾添加了‘\0’的字符数组,C风格字符串的末尾必须有一个’\0’。
2.1、C字符数组及其与string串的区别
char ch[ ]={‘C’, ‘+’, ‘+’}; //末尾无NULL
char ch[ ]={‘C’, ‘+’, ‘+’, ‘\0’}; //末尾显式添加NULL
char ch[ ]=”C++”; //末尾自动添加NULL字符 若[ ]内数字大于实际字符数,将实际字符存入数组,其余位置全部为’\0’。
2.3、string对象的操作
string s;
1) s.empty(); // s为空串 返回true
2) s.size(); // 返回s中字符个数 类型应为:string::size_type
3) s[n]; // 从0开始相当于下标访问
4) s1+s2; // 把s1和s2连接成新串 返回新串
5) s1=s2; // 把s1替换为s2的副本
6) v1==v2; // 比较,相等返回true
7) `!=, <, <=, >, >=` 惯有操作 任何一个大写字母都小于任意的小写字母
当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的:
string s1(“hello”);
string s3=s1+”world”; //合法操作
string s4=”hello”+”world”; //非法操作:两个字符串字面值相加
3.字符串操作函数
常见如:
字符串长度 (length)
string str = "478";
int len = str.length(); //len为3
删除某个元素:
string str = "478";
str.erase(0,1);//第0号开始,删除1个元素
string类函数
- =, s.assign() // 赋以新值
- swap() // 交换两个字符串的内容
- +=, s.append(),s.push_back() // 在尾部添加字符
- s.insert() // 插入字符
- s.erase() // 删除字符
- s.clear() // 删除全部字符
- s.replace() // 替换字符
- + // 串联字符串
- ==,!=,<,<=,>,>=,compare() // 比较字符串
- size(),length() // 返回字符数量
- max_size() // 返回字符的可能最大个数
- s.empty() // 判断字符串是否为空
- s.capacity() // 返回重新分配之前的字符容量
- reserve() // 保留一定量内存以容纳一定数量的字符
- [ ], at() // 存取单一字符
- >>,getline() // 从stream读取某值
- << // 将谋值写入stream
- copy() // 将某值赋值为一个C_string
- c_str() // 返回一个指向正规C字符串(C_string)的指针 内容与本string串相同 有’\0’
- data() // 将内容以字符数组形式返回 无’\0’
- s.substr() // 返回某个子字符串
- begin() end() // 提供类似STL的迭代器支持
- rbegin() rend() // 逆向迭代器
- get_allocator() // 返回配置器
4.int型与string型的互相转换
4.1 int型转string型
1.使用 to_string()函数
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
int a=30;
s=to_string(a); //这种会报错vs2010没有int型参数,必须强制转换long long
s=to_string(long long(a));
cout<<s<<endl;
return 0;
}//输出:30
2.使用stringstream
#include<iostream>
#include<string>
#include<sstream> //字符串流头文件
using namespace std;
int main(void)
{
string s;
stringstream ss;
int a=30;
ss<<a;
ss>>s;
cout<<s<<endl;
cout<< ss.str() << endl; //或者利用字符串流的str函数获取流中的内容
return 0;
}
在C++中更推荐使用流对象来实现类型转换,以上两个函数在使用时需要包含头文件 #include <sstream>
4.2 string型转int型
1.使用stringstream
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string s="35";
stringstream ss;
int a;
ss<<s;
ss>>a;
cout<<a<<endl;
return 0;
}
2.stoi()函数(stoi/stol/stoll等等函数)
int stoi (const string& str, size_t* idx = 0, int base = 10); //第一个为str输入,第二个默认0下标开始,第三个默认10进制
int stoi (const wstring& str, size_t* idx = 0, int base = 10);
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s="35";
int i = stoi(s);
cout<<i;
return 0;
}
//输出:35