c++字符串处理——string类型
1、字符概述 | |
---|---|
2、string 声明 | 1、string 字符串变量;2、初始化为空字符串 |
3.string初始化 | 1.赋值初始化(=)2.成员函数初始化() |
4.string赋值 | 1、支持赋值语句= 2、string.assign()成员函数相同 |
5.string输入输出 | 1、输入:cin>> 、getline(cin,s)2、输出cout |
字符串长度 | 1.string.size() 2、字符串的实际长度 |
字符串提取 | 1、下标运算符[] 2.string.substr(开始位置i,提取子字符串长度len) |
字符串查找 | 1.string.find(查找字符串)2、找到,返回下标位置;没有找到,返回-1(string::npos) |
字符串增加 | 1.初始体化 2、+=复合赋值运算符3、string.append(字符串变量或)4.string.insert(位置,子符串) |
字符串减少 | 1、string.erase(位置,长度) |
字符串替换 | string.replace(位置、长度,替换字符串) |
字符串排序 |
1、字符串以’\0’为结束标志。
2、string类型变量的字符串长度是任意长,但受计算机内存限制。
1、头文件:#include .
2、string变量声明:string 变量名
3、string类型变量的字符串长度是任意长,但受计算机内存限制。
//string类型声明
#include
#include //string类型不是内置类型
using namespace std;
int main(){
string name; //string是数据类型;
cout<<"input name:";
cin>>name;
cout<<"my name is "<<name<<endl;
return 0;
}
1、赋值形式:string s=“c++ ";
2、小括号形式:string s(“c++”);
3、小括号形式双参数:初始化多个相同字符 string s(10,”*“);
1、赋值字符串常量:string s; s=“c++ ";
2、赋值字符串变量:string st1,st2="c++ "; st1=st2;
(一)输入:
1、cin输入:(1)空格、Tab、换行等空白是分隔符,视为一个字符串输入结束
(2)忽略导入空白符。
(3)cin>>输入对最后空白符:读取继续保留在输入流,等待输入。
(4)在读入字符串结束时添加字符串结束标识‘\0’.
/*过滤多余的空格(NOI题库)。
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入格式:1行,一个字符串(长度不超过200)。句子头和尾都没有空格。
输出格式:过滤之后的句子
输入样例:Hello worold.This is c language.
输出样例:Hello world.This is c language.
*/
#include
#include
using namespace std;
int main(){
string s,stemp;
cin>>s;
while(cin>>stemp)
// 大多数情况下其返回值为cin本身(非0值),只有当遇到EOF(文件结束标志)输入时,返回值为0。
//输入EOF的方法,windows下输入ctrl+z, Linux下输入ctrl+d
{
s+=' '+stemp;//string赋值、+运行
}
cout<<s<<endl;
return 0;
}
2、读取一行字符串:getline(cin,变量名)
(1)getline(cin,变量名)允许读取一行且含有空格,默认为换行符结束。
(2)getline函数对换行符操作:读取而且丢弃,不保留输入流中,也不保存在字符串中。
(3)注意cin>>输入时残留在输入流的回车符。
/*统计数字字符个数(NOI题库).
输入1行字符,统计出其中数字字符的个数。
输入格式:1行字符串,总长度不超过255.
输入出格式:输出为1行,输出字符串里面数字字符的个数。
输入样例: Peking University is set up at 1898.
输出样例:4
*/
#include
#include
using namespace std;
int main(){
string s;
getline(cin,s);
int ans=0;
for(int i=0;i<s.size();++i)
//s.size()是string的成员函数,返回字符串的长度不包括字符串标志
{
if('0'<=s[i] && '9'>=s[i]) ans++;
}
cout<<ans<<endl;
return 0;
}
(二)输出:
使用cout输出,例子参照本文。
1、单个字符提取:使用下标[]运算符,进行个字符的提取。
2、连续子字符串的提取:使用成员函数s.substr(提取开始位置i,提取长度len);
/*
摘录文字。输入1行由字母和字符“#”组成的字符串。保证“#”出现偶次。
从前向后看,每两个“#”字符之间的字符串是要摘录的字字。请编程把摘录的字符串连续输出。
输入格式:1行字符串,总长度不超过100000.
输出格式:“#"号对之间的字符
输入样例: a#abcd#xyz#efgh#opq.
输出样例:abcdefgh
*/
#include
#include
using namespace std;
int main(){
string st,outst;
int p;
cin>>st;
for(int i=0;i<st.size();i++)
{
if(st[i]=='#')
{
p=i+1;
for(i++;st[i]!='#';i++);//没有循环体,改变i++值
outst+=st.substr(p,i-p);
}
}
cout<<outst<<endl;
return 0;
}
``
### (二)查找字符串
1、成员函数string.find(字符串)返回子字符串出现的位置(下标),没有找到则返回-1(一般写成string::npos)。
```cpp
/*
选择你喜爱的水果(NOI题库)
程序中保存了七种水果的名字,要求用户输入一个与水果有关的句子。程序在已存储的水果名字中搜索,
是否包含七种水果的名称。如果包含,则用”Brussels sprouts“替换,并输出替换后的句子。若没出现,则输出
"You must not enjoy fruit".
假设七种水果的名字为:apple,bananas,peaches,cherries,pears,orange,strawerries.
输入格式:多行,每行是一个字符串,只会出现一种水果名称,且出现一次。
输出格式:被替换过的句子。
输入样例:
I really love peaches on my cereal.
I'd rather have a candy bar
apples are wonderful with lunch
输出样例:
I really love Brussels sprouts on my cereal.
You must not enjoy fruit.
Brussels sprouts are wonderful with lunch.
*/
#include
#include
using namespace std;
string fruits[]={"apples","bananas","peaches","cherries","pears","oranges","strawberries"};
int main(){
string s;
while(getline(cin,s)){
int pos,id=-1;
for(int i=0;i<7;i++)
{
pos=s.find(fruits[i]) ;
if(pos!=string::npos)
{
id=i;break;
}
}
if(-1==id)
cout<<"You must not enjoy fruit."<<endl;
else
{
s.replace(pos,fruits[id].size(),"Brussesls sprouts");
cout<<s<<endl;
}
}
return 0;
}
###(三)字符串增加
1、字符串“+”运算符:连接两字符串,但必须字符串变量参与(其中一个必须是string变量)。
2、字符串“+=”复合赋值运算符:
3、string.inserts(插入位置,插入字符串):在字符串当中位置插入字符串。
4、string.append(插入字符串):在字符串后面追加子字符串
#include
#include
using namespace std;
int main(){
string s="22";
s.insert(1,"+");
s.append("=4");
cout<<s<<endl;
return 0;
}
运算结果为:2+2=4
1、string.erase(开始删除字符位置,删除字符长度len)
#include
#include
using namespace std;
int main(){
string st="My name name is hipoole.";
st.erase(2,5);
cout<<st<<endl;
return 0;
}
1.string.replace(替换开始位置,替换长度len,替换子符串):是成员函数,是删除字符串和播放字符串复合操作。