了解更多关于String的用法详解,前往C++ string 用法详解 (byvoid.com)
先声明一个string 类型的变量:
string strinfo;
string类型的变量可以使用加减乘除的运算符号以及大于小于等关系符号,
对strinfo整体进行初始化时可以直接如此:
strinfo="abcd".
若要一个一个字符进行初始化时,不能用strinfo[0]=xxx,strinfo[1]=xxx...如此初始化,而要用+=要输入的字符.
其中strinfo[i]表示strinfo中下标为i的字符。
输入可以用cin>>;输出则用cout<<;
清空字符串用strinfo=""
或
strinfo.clear();
一、函数介绍
1.strinfo.substr(指定起始位置pos,长度n):
功能:复制子字符串,返回值为长度为n的子字符串(主要应用);其中pos为0时表示从字符串第0个字符开始。
例:
cout << strinfo.substr(first, last - first + 1)<<endl;
2.getline(cin,strinfo):
功能:从输入流中读一行,即输入一行字符串(支持输入空格)。其中第一个参数为固定参数‘cin’。
主要应用场景:读入多行带有空格的字符串时,无法用cin读入,所以会用到getline
注意:在getline之前用cin输入时,残留的回车符会被getline读取,所以要在getline前加getchar();
示例代码如下:
#include <iostream>
#include<cstdio>
#include <string>
using namespace std;
int main()
{
string s[3];
int n;
cin >> n;
getchar();//cin不读回车,把回车读掉,避免getline读回车
for (int i = 0; i < n; i++)
{
getline(cin, s[i]);
}
for (int i = 0; i < n; i++)
{
cout << s[i] << endl;
}
return 0;
}
3.find系列
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个找到字符的下标
find_first_not_of 查找不包含子串中的任何字符,返回找到字符的下标
find_last_of 查找包含子串中的任何字符,返回最后一个找到字符的下标
find_last_not_of 查找不包含子串中的任何字符,返回最后一个找到字符的下标
下标即地址;
以上所有函数的目标若未查找到,则均返回
string::npos
str=",";
A.strinfo.find(str)表示在strinfo中寻找字符串str,
若找到则返回该字符串第一次出现的下标。
B.strinfo.rfind(str)表示在strinfo中从后往前寻找字符串str,
若找到则返回该字符串最后一次出现的下标。
find_first_of 是给定一个要查找的字符集,找到这个字符集中任何一个字符所在字符串中第一个位置。或许看一个例子更容易明白。
有这样一个需求:过滤一行开头和结尾的所有非英文字符。看看用string 如何实现:
#include <string>
#include <iostream>
using namespace std;
int main()
{
string strinfo=" //*---Hello Word!......------";
string strset="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int first = strinfo.find_first_of(strset);
if(first == string::npos)
{
cout<<"not find any characters"<<endl;
return -1;
}
int last = strinfo.find_last_of(strset);
if(last == string::npos)
{
cout<<"not find any characters"<<endl;
return -1;
}
cout << strinfo.substr(first, last - first + 1)<<endl;
return 0;
}
这里把所有的英文字母大小写作为了需要查找的字符集,先查找第一个英文字母的位置,然后查找最后一个英文字母的位置,然后用substr 来的到中间的一部分,用于输出结果。下面就是其结果:
Hello Word
前面的符号和后面的符号都没有了。像这种用法可以用来查找分隔符,从而把一个连续的字符串分割成为几部分。
特别是当分隔符有多个的时候,可以一次指定。例如有这样的需求:
张三|3456123, 湖南
李四,4564234| 湖北
王小二, 4433253|北京
...
我们需要以 “|” “,“为分隔符,同时又要过滤空格,把每行分成相应的字段。
目标任务:把文本中的人名、号码、地名依次提取出来。
代码如下:
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
int i,firstc[3],lastc[3],firstn[3], lastn[3];
string str1 = ",| ";
string str3 = "1234567890";
string str2[3];
for (i = 0; i < 3; i++)
getline(cin, str2[i]);
for (i = 0; i < 3; i++)
{
firstc[i] = str2[i].find_first_of(str1);//find返回元素下标
lastc[i] = str2[i].find_last_of(str1);
firstn[i] = str2[i].find_first_of(str3);
lastn[i] = str2[i].find_last_of(str3);
}
cout << firstc[0]<<endl;//last[0]==12
for(i = 0; i < 3; i++)//人名
{
cout<<str2[i].substr(0, firstc[i])<<endl;
}
for (i = 0; i < 3; i++)//号码,由于号码前后既有空格又有其他符号所以用找数字更方便
{
cout << str2[i].substr(firstn[i], lastn[i]- firstn[i]+1) << endl;
}
for (i = 0; i < 3; i++)//地名
{
cout << str2[i].substr(lastc[i]+1, str2[i].size()-(lastc[i] + 1)) << endl;
}
}
寻找中文不能用直接find_first_of()等函数,而要用间接的方式找其他符号作为端点来找中文;
寻找英文、数字、标点等时则可以直接使用一系列查找函数。
4.s.erase(x,y)
表示将字符串s从x位置起删除y个字符;
strinfo.erase(pos,n);没啥可说,n为数量;
5.s.insert(x,y)
表示将字符串y(或字符y)插入到s的x位置处
(1).strinfo.insert(pos,n,ch):在下标pos前插入n个字符ch;
(2).strinfo.insert(pos,str):在下标pos前插入字符串str;
(3).strinfo.insert(pos,str,pos_1,n):在strinfo下标pos前插入
字符串str从下标pos_1开始提取n个字符得到的子字符串;
6.strinfo.push_back(x)
表示在s的末尾插入字符x
7.reverse(strinfo.begin(),strinfo.end())
将字符串s翻转(实为<algorithm>中的函数)
不使用其返回值,直接使用函数reverse即可,注意其参数;
8.strinfo.size() 表示该字符串字符的数量;