此博客为我对网上相关资料的总结,以方便自己后续查阅。
〇、字符串定义和初始化
string s; //生成一个空字符串s
s="string"; // 将s初始化为一个字符串字面值
char char s[10]="string";
string s1(s); //string s(str);拷贝构造函数生成str的复制品
string s2(s,3); // string s(str, stridx);将字符串str内"始于位置stridx"的部分当作字符串的初值
string s3(s,3,2); /* string s(str, stridx, strlen) ; 将字符串str内"始于stridx且长度顶多
strlen"的部分作为字符串的初值*/
string s4(chars,5); //string s(chars, chars_len) ;将C字符串前chars_len个字符作为字符串s的初值。
string s5(chars,3,3); /* string s(str, stridx, strlen) ; 将字C字符串chars内"始于stridx且长度顶多
strlen"的部分作为字符串的初值*/
string s6(10,'s'); // string s(num, ‘c’) ; 生成一个字符串,包含num个c字符
string s7("Sunday"); // 将s初始化为一个字符串字面值副本
string s8(s.begin(),s.end()-1); // string s(begin, end);以区间begin/end(不包含end)内的字符作为字符串s的初值
cout<<s<<' '<<s1<<' '<<s2<<' '<<s3<<' '<<s4<<' '<<s5<<endl;
cout<<s6<<' '<<s7<<' '<<s8<<endl;
运行结果:
一、字符串输入
1.cin>>
cin会从流中取数据,遇到空格或者换行符都会停止
2.getline()
(1)getline() 接受一个字符串,可以接收空格
(2)getline可以指定第三项参数,即遇到特定的字符停止,默认 是‘\n’,可以手动写成如‘,’.在遇到终结符后,终结符会被丢弃,不存入字符串中。在下次读入操作时,将在终结符的下个字符开始读入。
string s,s1,s2;
cin>>s;//遇空格、回车、Tab结束
getline(cin,s1);//按回车键结束输入
getline(cin,s2,'#');//输入一串字符(不管多少个回车键),只要是在‘#’号之前的字符都会读取并保存
cout<<"s:"<<s<<endl;
cout<<"s1:"<<s1<<endl;
cout<<"s2:"<<s2<<endl;
运行结果
观察结果里的s1发现Tuesday前有一个空格,这是因为cin碰到空格停止读取后,缓存区里剩余了一个空格。为此可以加一个getchar()吸收多余的字符,对换行符也是如此,需要先将缓存里的换行符吸收掉,否则会赋值为空串,这里需要特别注意。
3.cin.get()
cin.get()可以给字符和字符数组赋值
char s;
char c[10];
s=cin.get(); //如果cin.get()任何参数,默认从缓存区读一个字符
cin.get(c,10); //第一项填数据名,第二项填其长度,就可以给特定字符变量输入字符串
cout<<s<<endl<<c<<endl;
注意到给字符数组赋值时字符数组末尾自动加‘\0’,所以实际读取的字符长度比参数少一。
4.cin.getline()
cin.getline()实际有三个参数,cin.getline(字符数组名,接受个数num,结束字符),当第三个参数省略时,系统默认为'\0'。输入过程中达到num个数或者提前遇到结束字符,输入结束。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。
char str[10];
char str1[5];
cin.getline(str1,4);
cin.getline(str,5);
cout<<str1<<endl;
cout<<str<<endl;
运行结果:
可见str没有被输入。
5.gets()
gets()可以给字符数组赋值,遇换行符’\n’结束(然后将换行符丢掉,下次读将从换行符下个字符读取),如果使用gets()前有换行符要用 getchar()吸收换行符。
int a;
cin>>a;
cout<<a<<endl;
getchar(); //吸收分隔符
char s[8];
gets(s);
puts(s);
二、字符串分割
string substr(size_t pos=0,size_t n=npos)const;
功能:获取子字符串
参数说明:pos为起始位置,n为长度。
三、字符串查找
size_t find(const string& str,size_t pos=0)const;
参数说明:str为子串,pos为初始查找位置。
功能:查找子字符串第一次出现的位置,否则返回string::npos。
四、字符串删改
1.append(string)将string拼接到字符串末尾,可以直接用+=。
2.insert(pos,string)在pos位置前插入string。
insert(it,it1,it2)将迭代器[it1,it2)之间的字符插入到迭代器it位置前。
3.erase(it)删除迭代器it位置的字符
erase(it1,it2)将迭代器[it1,it2)之间的子串删除。
erase(pos,len)将从位置pos开始的len个字符删除.
4.replace(pos,len,str)将pos位置开始,len长度的子串替换为str.
replace(it1,it2,str)将迭代器[it1,it2)之间的子串替换为str.
5.clear()清空字符串
*五、string、char*、const char*、char[]之间的转换
1.string->const char*
string str="hello";
const char *s=str.c_str();
2.const char*->char *
const char *s="hello";
char *a=const_cast<char*>(s);
3.char *、const char *->string
直接赋值
const char *s="hello";
char *a="world";
string str=s;
string str1=a;
4.char*->const char*
直接赋值
const char *s;
char *a="world";
s=a;
5.string->char[]
char b[20];
string str="first";
strcpy(b,str.c_str());
6.char[]->string,char ,const char
直接赋值
六、string转化为其他类型
1.sscanf(),sprintf()
初看sscanf,sprintf和scnaf,printf很像,scanf,printf是从输入设备将值输入到指定变量,将变量值输出到输出设备;sscanf,sprintf是从字符串中读取值到指定变量,将变量值输出到字符串中。sscanf,sprintf可用于字符数组与其他类型变量的转化。
int a;
float b;
char s[10];
char c[20]="20:saturday 3.14";
sscanf(c,"%d:%s %f",&a,&s,&b);//数据从左往右传递
printf("%d %s %.2f\n",a,s,b);
sprintf(c,"%s%d",s,a);//数据从右往左传递
printf("%s\n",c);
运行结果
2.stringstream
<sstream>定义了三个类:istringstream,ostringstream,stringstream,分别用来进行流的输入、输出和输入输出。
stringstream stream;
int a=100;double b=3.14;
string str;
stream<<a<<b;
stream>>str;
cout<<str<<endl;
stream.clear();//在进行多次类型转换时必须用clear()清空流。如果是单类型转换也可用stream.str("").
bool c=false;
stream<<c;
stream>>str;
cout<<str<<endl;
stream.str()返回流中数据