#include <iostream> //string 只要有iostream就可以用string了
using namespace std;
int main(){
// 初始化字符串方式
string s1;// 默认的空字符串
string s2 = s1;//可以动态 s2是s1的一个副本
string s3 = "hiya";//s3是该字符串字面值的一个副本
string s4(10, 'c');//s4的内容是:cccccccccccccc扎不多的了 总之就是10个c
// string读入
cin >> s1 >> s2;
// string不可以用scanf读入
cout << s1 << ' ' << s2 << endl;
// 但是输出可以用printf输出
// printf("%s\n", s1.c_str()) //,c_str()是一个方法返回值是字符数组地址
// 也可以用puts(s1.c_str())
// string 函数
// empty() 指这个string是否是空的 空的返回true 不是则返回false
cout << s1.empty() << endl;
cout << s1.size() << endl;//size函数可以返回字符串长度和strlen一样 但是他的里面专门存了一个数 时间复杂度是01的是非常快的
//s.length()和size一样 完全等价
//string可以直接用运算符
// string的加法必须其中有一个string字符串
// string s3 = "hello" + "!";//这样是不行的
// string s3 = s2 + "!"//这样是可以的 当s2是string的时候
//此时s2是string
//string 可以当成字符数组进行循环
string s = "Hello World!";
for(int i = 0; i < s.size(); i++)
cout << s[i] << endl;
//当想遍历某一个string的时候也可以这么写
for(char c : s) cout << c << endl;//这个叫c++的范围遍历 前面的char值指字符数组里每一个字符的类型 c指遍历每一个元素的变量 s指字符串 c会顺次遍历 也就是正顺序遍历s中的每一个元素变量
// for(x:y)是c++ 11标准中推出的
// for(char c : s)//想要改变里面c的值
// {
// c = 'a';
// }//这样是没有效果的 因为上面那个char c 和下面c不是一个东西
for(char &c : s)//可以这样加个引入地址符号强行把两个绑定起来 这样上面那个c就可以和下面的绑定起来了 即一个会变另外一个也会变
{
c = 'a';
}
// auto a = "hello world"//这个auto可以让编译器去猜他是什么类型的
cout << s << endl;
return 0;
}