#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;

int main()
{
	//1.scanf和printf除了多功能外,还比cin,cout效率更高,建议数据量大时使用scanf和printf
	
	//2.string类型需包含<string>头文件,可以用cin,cout直接读写,scanf和printf不支持
	//Example:
	cout<<"Showing 2.cin,cout input/output std::string"<<endl;
	string str;
	cin>>str;		//正确 
	cout<<str<<endl;//正确 
//	scanf("%s",str); //去掉注释编译错误 
//  scanf("%s",&str);//去掉注释溢出    
//	printf("%s",str);//去掉注释编译错误
	
	//3.string类型需本质上也是char数组,可以用下标访问
	//Example:
	cout<<"Showing 3.use [x] to read/write std::string"<<endl;
	string str2;
	cin>>str2;
	char a1=str2[0];			//正确
	char a2=str2[1];			//正确
	char a3=str2[2];			//正确
	printf("%c %c %c\n",a1,a2,a3);//正确
	
	//4.cin.getline()一共有3个参数,最后一个参数是结束标志(一个字符,可以省略,省略时为'\n'(换行))
	//Example:
	cout<<"Showing 4.cin.getline(char_type* __s, streamsize __n, char_type __delim)\'s 3rd input"<<endl;
	char csz[10];
	cin.getline(csz,10,'d'); //读到d停止,保存d之前的内容 
	printf("%s\n",csz);
	
	//5.string小技巧
	
	//(1)测量长度,string用x.length(),char数组用strlen(x)(需要<cstring>头文件) 
	//Example:
	cout<<"Showing 5(1).use x.length() or strlen(x) to measure the length of std::string and char[]"<<endl;
	string str3;
	char csz2[10];
	cin>>str3;
	scanf("%s",csz2);
	cout<<str3.length()/*str3的长度*/<<endl<<strlen(csz2)/*csz2[]存储的字符串的长度*/<<endl;
	
	//(2)截取字符,x.substr(起始位置(由0开始数),结束位置)(只能string,值以返回值的形式带回,需要承接或输出
	cout<<"Showing 5(2).use x.substr(a,b) to sub std::string"<<endl;
	string str4;
	cin>>str4;
	cout<<str4.substr(1,3)<<endl;//截取str4第二个到第四个字符
	
	//(3)连接字符串,三种方法
	//[1] 用+或+=,左边一定是string,右边可以是char或string,值和普通+或+=一样
	//Example:
	cout<<"Showing 5(3)[1].use += to connect 2 strings"<<endl;
	string str5,str6;
	cin>>str5>>str6;
	str5+=str6;		//用+=连接
	cout<<str5<<endl;
	//[2] 用x.append(y)(只能string,值以返回值的形式带回,需要承接或输出)
	//Example:
	cout<<"Showing 5(3)[2].use x.append(y) to connect 2 std::strings"<<endl;
	string str7,str8;
	cin>>str7>>str8;
	cout<<str7.append(str8)<<endl;
	//[3] 用strcat(x1,x2)(只能char数组,值赋给x1)
	//Example:
	cout<<"Showing 5(3)[3].use strcat(x1,x2) to connect 2 char[]s"<<endl;
	char csz3[10],csz4[10];
	cin.getline(csz3,10);
	cin.getline(csz4,10);
	strcat(csz3,csz4);
	printf("%s\n",csz3);
	
	//番外:char*指针
	//定义:char *pointer
	//可以对它赋值为一个字符串或字符数组名,可使用cstring定义的函数
	//功能较少,调试麻烦,不建议使用
	//Example:
	cout<<"Showing FW.char*"<<endl;
	char *pointer,*pointer2;
	char hlw[13]="Hello,World!";
	pointer="Hello,World!";
	pointer2=hlw;
	cout<<"pointer="<<pointer<<endl;
	cout<<"pointer2="<<pointer2<<endl;
	
	//番外2:字符串解析函数sscanf(头文件<cstdio>)
	//原型:int sscanf(const char* source,const char* format,...)
	//在source中填一个字符数组名,后面跟scanf一样,sscanf会将source中的数据作为输入按格式付给相应的变量
	//只能char数组或char指针,不兼容string
	//Example:
	cout<<"Showing FW2.sscanf"<<endl;
	char csz5[13]="100-29.2-A",ch;
	int integer;
	float fl;
	sscanf(csz5,"%d-%f-%c",&integer,&fl,&ch);
	cout<<"int="<<integer<<endl<<"float="<<fl<<endl<<"char="<<ch<<endl;
	return 0;
}