C++:字符串基本操作

字符串常用基本操作

一、字符串定义、初始化

1.定义

(1)使用字符数组char str[10];
(2)使用"string"类定义一个字符串string str;
【注意】:使用"string"类定义字符串需加头文件<string>或万能头

string与字符数组的区别:

  • string
    C++中的类,包含了大量的成员函数,可以进行快捷的操作,类型为string,不以'\0'结束
  • 字符数组
    C语言中的字符串表示,用char数组实现,类型为const char *,字符串以'\0'结尾

2.初始化

(1)使用字符数组char s1[]="I am Teacher Zhang";
(2)使用"string"——构造函数

1. string str;                       //定义并生成空字符串
2. string str="";                     //定义并生成空字符串

3. string s(str);                     //将str的值复制给s

4. string s(str, strbegin, strlen);   //将字符串str中从下标strbegin开始,长度位strlen的部分复制给s作为初值

5. string s(cstr, char_len);          //将C_string类型(一般指字符数组)的cstr前char_len个字符串作为字符串s的初值

6. string s(str, stridx);             //将字符串str中下标stridx开始到字符串结束的位置作为字符串初值

7. string s(num, ch);                 //生成num个ch字符组成的字符串作为字符串s的初值

【注意】:下标均是从0开始

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

int main(){
    char cstr[]="I am Teacher Zhang";
    string str="You are Teacher Cheng";

    string s1;
    string s2="";
    string s3(str);
    string s4(str,2,7);
    string s5(cstr,7);
    string s6(str,7);
    string s7(7,'z');
    cout<<"s1: "<<s1<<endl;
    cout<<"s2: "<<s2<<endl;
    cout<<"s3: "<<s3<<endl;
    cout<<"s4: "<<s4<<endl;
    cout<<"s5: "<<s5<<endl;
    cout<<"s6: "<<s6<<endl;
    cout<<"s7: "<<s7<<endl;
}

运行结果:

二、字符串输入、输出

1.字符数组的输入、输出

通常使用scanf()printf()格式控制使用"%s"。也可以使用cin和cout。

char cstr[10];           //定义字符数组
scanf("%s",cstr);        //输入字符串,此处"cstr"即为地址,则可不用"&cstr"
printf("%s",cstr);       //输出字符串

cin>>cstr;
cout<<cstr;

2.string类型字符串输入、输出

(1)cin输入字符串,但遇到空格会停止接收字符。若输入的字符串中不含空格、回车则直接使用,如果包含则使用方法②。
-案例1-:基础格式

string s;
cin>>s;   
cout<<"s: "<<s;

执行结果:

zhang
s: zhang

-案例2-:字符串包含空格①

string s;
cin>>s;
cout<<"s: "<<s;

执行结果:

zhang cheng
s: zhang

-案例3-:字符串包含空格②

string s1,s2;
cin>>s1;
cin>>s2;
cout<<"s1: "<<s1<<endl;
cout<<"s2: "<<s2;

执行结果:

zhang cheng
s1: zhang
s2: cheng

-案例4-:输入一行字符串("单词"+"空格"构成),获取其中的单词

//消除多余空格
for(string s;cin>>s;){
    cout<<s<<" ";
}

执行结果:

I       am    Teacher                         Zhang
I am Teacher Zhang

(2)getline输入,接收整行输入的字符串。遇到换行符停止接收字符。语法:getline(cin,str);
-案例1-:基础格式①

string s;
getline(cin,s);   
cout<<"s: "<<s;

执行结果:

I am Teacher Zhang
s: I am Teacher Zhang

-案例2-:基础格式②

string s1,s2;
getline(cin,s1);   
getline(cin,s2);   
cout<<"s1: "<<s1<<endl;
cout<<"s2: "<<s2;

执行结果:

I am Teacher Zhang
You are Teacher Cheng
s1: I am Teacher Zhang
s2: You are Teacher Cheng

-案例3-:cin、getline混合使用的多行输入(第一行输入一个整数,第二行输入一行带空格的字符串)

int n;
string s;
cin>>n;
getline(cin,s);     
cout<<"n: "<<n<<endl;
cout<<"s: "<<s;

输入

5
You are Teacher Cheng

执行结果:

n: 5
s:

执行结果s为空串,原因是cin输入遇到换行符或空格停止,在输入'5'后回车(换行符),cin截断,getline读入换行符,也停止接收字符,因此s为空串。
解决方法为:多写一个getline或者使用getchar()来接收多余的换行符

int n;
string s;
cin>>n;
getchar();   //接收多余的换行符
getline(cin,s);     
cout<<"n: "<<n<<endl;
cout<<"s: "<<s;

输入

5
You are Teacher Cheng

执行结果:

n: 5
s: You are Teacher Cheng

三、string类字符串遍历

(1)常规方法——下标遍历(使用str.size()获取字符串长度)

string str="Zhang";
for(int i=0;i<str.size();i++){
    cout<<str[i]<<" ";
}

执行结果:

Z h a n g

(2)迭代器遍历

string str("Zhang");
string::iterator it;  //创建string的迭代器
for(it=str.begin();it!=str.end();it++){
    /*
    ① 迭代器it类似于指针,初始化为str第一个元素的迭代器
    ② 终止条件str.end()是指最后一个元素的下一个迭代器,并非最后一个元素的迭代器!!!
    */
    cout<<*it<<" ";  //it为指针,则要输出指向的值即为*it
}

执行结果:

Z h a n g

(3)新式for循环(c++11及以上)

string str("Zhang");
for(char ch:str){  //字符类型的ch依次取str里面的字符
    cout<<ch<<" ";
}

执行结果:

Z h a n g

该遍历过程与Python中for ch in str过程相似。

四、string类字符串常用操作(成员函数)

1.string字符串特性

与字符数组不同,string不可通过下标对元素进行赋值更新,需要使用“拼接”或“替换”的操作。
典例:将string a中的一个子串里每一个字符单独赋值给string b的相应位置,然后输出b。使用字符数组的操作a[i++]=b[j++]是错误的。

2.获取字符串长度

方法 含义 使用
str.size()str.length() 返回string对象的字符个数,二者执行效果相同 string str("Zhang"); int len=str.size();

3.增——插入

方法 含义 注意事项
str.push_back(ch) 在字符串str末尾插入字符 只可插入字符。'1'√ "1" ×
str.insert(pos,str1) 在字符串str的pos位置插入字符串str1 只可插入字符串。"1"√ '1' ×
str.insert(pos,num,ch) 在字符串str的pos位置插入num个字符ch 只可插入字符。'1'√ "1" ×
str.insert(pos,str1,idx,num) 在字符串str的pos位置插入字符串str1中从idx位置开始后面的num个字符 下标开始位置为0
string s="Cheng"
string str1("Zhang");
str1.push_back('i');  //末尾插入字符'i',不可为"i"
cout<<"str1: "<<str1<<endl;

string str2(s);
str2.insert(4,"i");  //插入字符串"i",不可为'i'
cout<<"str2: "<<str2<<endl;

string str3(s);
str3.insert(4,2,'i'); //插入字符'i',不可为"i"
cout<<"str3: "<<str3<<endl;

string str4(s);
str4.insert(2,str1,1,5);
cout<<"str4: "<<str4<<endl;

执行结果:

str1: Zhangi
str2: Chenig
str3: Cheniig
str4: Chhangieng

4.增——拼接

方法 含义
+操作符 将两个字符串直接拼接
str.append(s) 将字符串s拼接在str后面
str.append(s,begin,end) 将字符串s从begin到end位置的子串拼接在str后面
str.append(len,ch) 将len个字符ch拼接在str后面
string s1="Cheng";
string s2="Zhang";

cout<<"s1+s2: "<<s1+s2<<endl;

string str1(s1);
str1.append(s2);
cout<<"str1: "<<str1<<endl;

string str2(s1);
str2.append(s2,2,4);
cout<<"str2: "<<str2<<endl;

string str3(s1);
str3.append(3,'A');
cout<<"str3: "<<str3<<endl;

执行结果:

s1+s2: ChengZhang
str1: ChengZhang
str2: Chengang
str3: ChengAAA

5.删

方法 含义
str.pop_back() 删除字符串str最后一个字符
str.erase(start,end) 将字符串s下标start到下标end的字符删除
str.erase(iterator p) 删除字符串中p所指的字符,p为str的迭代器
str.erase(iterator b,iterator e) 删除字符串中b到e所指的字符,b和e为str的迭代器
string s1="Cheng";
string s2="Zhang";

string str1(s1);
str1.pop_back();
cout<<"str1: "<<str1<<endl;

string str2(s1);
str2.erase(1,3);
cout<<"str2: "<<str2<<endl;

string str3(s1);
str3.erase(str3.begin()+3);  //str.begin()即为迭代器,指向字符'C',+3后指向'n'。必须为str3.begin()。
cout<<"str3: "<<str3<<endl;

string str4(s1);
str4.erase(str4.begin()+1, str4.end()-1);  //删除str4下标区间为[str4.begin()+1,str4.end()-1]的子串。必须为str4.begin()、str4.end()。
cout<<"str4: "<<str4<<endl;

执行结果:

str1: Chen
str2: Cg
str3: Cheg
str4: Cg

6.改——替换

方法 含义
str.replace(pos,n,s) 把字符串str从索引pos开始的n个字符替换为字符串s
str.replace(pos,n,m,ch) 把字符串str从索引pos开始的n个字符替换为m个字符ch
string s1="Cheng";
string s2="Zhang";

string str1(s1);
str1.replace(1,3,"HHHHH");
cout<<"str1: "<<str1<<endl;

string str2(s1);
str2.replace(1,3,7,'Y');
cout<<"str2: "<<str2<<endl;

//替换某个具体位置的字符
string str3(s1);
str3.replace(0,1,1,'Z');
cout<<"str3: "<<str3<<endl;

执行结果:

str1: CHHHHHg
str2: CYYYYYYYg
str3: Zheng

7.查——查找

方法 含义
str.find(s) 查找字符串或字符s在字符串str中第一次出现的位置,返回找到的位置索引,-1表示查找不到
str.find(s,pos) 查找字符串或字符s在字符串str[pos,str.size()-1]中第一次出现的位置,返回找到的位置索引,-1表示查找不到
str.rfind(s) 查找字符串或字符s在字符串str中最后一次出现的位置(反向查找),返回找到的位置索引,-1表示查找不到
str.find(s,pos) 查找字符串或字符s在字符串str[0,pos]中最后一次出现的位置,返回找到的位置索引,-1表示查找不到
string str="I am Teacher Zhang";
int n;

n=str.find("a");
cout<<"a-pos: "<<n<<endl;

n=str.find("a",6);
cout<<"a-pos: "<<n<<endl;

n=str.rfind("a");
cout<<"a-pos: "<<n<<endl;

n=str.rfind("a",5);
cout<<"a-pos: "<<n<<endl;

n=str.find("ch",7);
cout<<"ch-pos: "<<n<<endl;

n=str.rfind("ch",6);
cout<<"ch-pos: "<<n<<endl;

执行结果:

a-pos: 2
a-pos: 7
a-pos: 15
a-pos: 2
ch-pos: 8
ch-pos: -1

8.其他函数

(1)反转

方法 含义
reverse(str.begin(),str.end()) 使用中的reverse函数将str反转
string s="Zhang";
reverse(s.begin(),s.end());
cout<<s;

执行结果:

gnahZ

(2)判断空串

方法 含义
str.empty() 判断str是否为空,为空返回1,不为空返回0

(3)截取子串

方法 含义
str.substr(pos) 得到字符串str从pos到结尾的子串
str.substr(pos,n) 得到字符串str位置为pos后面的n个字符组成的子串
string s="I am Teacher Zhang";
string s1=s.substr(5);
string s2=s.substr(5,7);
cout<<"s1: "<<s1<<endl;
cout<<"s2: "<<s2<<endl;

执行结果:

s1: Teacher Zhang
s2: Teacher

(4)数字转换字符串

方法 含义 注意
to_string() 将基本类型的值转换为字符串 char类型的转换是转换成它的ASCII值,而不是字符
string s;
int a=1111;
long long b=22222222;
char c='x';
s=to_string(a);
cout<<s<<endl;
s=to_string(b);
cout<<s<<endl;
//将转换成ASCII值120
s=to_string(c);  
cout<<s<<endl;

执行结果:

1111
22222222
120
posted @ 2024-02-05 02:45  ZghzzZyu  阅读(406)  评论(0编辑  收藏  举报