C++中string类常见用法
string,主要用于字符串处理
1、字符串的输入
读入和输出整个字符串,只能用cin和cout
输入一个字符串s, 如果字符串中有空格 不能用cin,要使用getline(cin,s)
其中,getline()函数定义在<string>头文件中
2、字符/字符串与数值转换(C++11)
将字符转化成int型用stoi(s[i])或者s[i]-'0'
stoi(s)将字符串转换成int型数值
将数值型转换成string型 用to_string
eg:to_string(num)将数值类型的变量转换成string类型
3、字符串的插入insert()
1)eg:s.insert(1,1,c);
向s的标号为1的位置插入1个字符c
2)eg:str1.insert(2,str2,0,4);
将str2脚标0开始的连续4个字符插入到str1脚标2开始的地方
4、字符串匹配查找find()
1)s1.find(s2[i])==string::nops 表示在s1中找不到s2[i]这个字符 返回nops
应用到两个字符串去重的问题中,可以定义string str 利用字符串的拼接将最后需要输出的内容全部存在str 直接输出即可
2)
string str;
int pos;
int index=s.find(string str, int pos)
如果find()函数中除了有被找寻的字符串,还有一位整型数,表示从该位置开始遍历被搜索的字符串,已找到被找寻的字符串。返回的index是str在s中第一次出现的位置
类比:
map<string,bool>op
在map中 使用op.count(dem[i])==1在op中查找是否有key为dem[i]的元素
5、转换函数to_
tolower(char/int型变量),不能将整个string一起转换
6、跟string有关的头文件区分
#include <cstring> //不可以定义string s;可以用到strcpy等函数
using namespace std;
#include <string> //可以定义string s;可以用到strcpy等函数
using namesapce std;
#include <string.h> //不可以定义string s;可以用到strcpy等函数
7、字符串长度
在字符串中length()函数和size()函数具有同样的效果
8、getchar()
定义在<stdio>头文件中
getline()之前需要用getchar()吸收空白符,清除缓存区
getchar函数功能:
从stdio流中读字符,相当于getc(stdin),它从标准输入里读取下一个字符。返回类型为int型,返回值为用户输入的ASCⅡ码,出错返回-1。
具体说明:
1)从缓冲区读走一个字符(相当于清除缓冲区);
2)前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符取走的话,gets()就不会等待从键盘键入字符,而是会直接取走这个“无用的”回车符,从而导致读取有误;
3)getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab),getchar()使用不方便,解决方法:
- 使用下面的语句清除回车: while(getchar()!='\n');
- 用getche()或getch()代替getchar(),其作用是从键盘读入一个字符(不用按回车),注意要包含头文件<conio.h>
9、gets()函数getline()
1)gets()是C中的函数,定义在stdio头文件 而不是string.h头文件
只能在遇到回车或者EOF结束输入 所以gets函数可以用于输入带有空格的字符串。
eg:
char a[100];
gets(a);//gets函数可以直接获得一个数组
2)getline()是c++中的函数,包含在string头文件里, 与gets()函数功能相似,但是能自定义结束符。
10、strtok 分割字符串为一组字符串
1)要使用strtok函数需要包含头文件<string.h>
或者#include <cstring>
2)strtok函数的作用是把字符串以规定的字符分割开:
本质上是将字符串分段,并且除去间隔字符,进行存储
eg:
char *p;
p = strtok(buf, "$");
p为指针,buf也是指针。这句代码的意思就是把buf中的字符串以"$"为分隔符分割开来,分割出来的字符串保存到指针p中。
3)再次调用strtok函数时,把buf换成NULL,不需要再写buf。已经分割掉的单位部分用buf字符串上脱落,strtok函数会把分割前的字符串破坏掉,即每次分割后,原来的字符串就会少掉一部分,完整性会被破坏。
p = strtok(NULL, "$");
4)p = strtok(buf, "$,");
这句代码的意思是以"$"和","为分隔符分割buf中的字符串。每当遇到这两个字符其中一个都会分割,不是遇到"$,"两个字符连在一起才分割
11、获得字符串的子串substr()
#include<string> #include<iostream> using namespace std; int main() { string s("12345asdf"); string a = s.substr(0,5);//获得字符串s中从第0位开始的长度为5的字符串 cout << a << endl; } |
输出结果为:12345
12、删除字符串的子串erase()
1)str.erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
2)去掉字符串的哪一个字符
s2.erase(s2.begin()); //去掉第一个元素
s2.erase(s2.end() - 1); //去掉最后一个元素 end()指向结尾的下一个
13、字符串替换函数replace
res[i].replace(pos1, s.length(), d.count(s) ? d[s] : "");
//字符串res[i]从pos1开始s.length()长的子串替换成d[s]或""