STL中关于字符串的常用函数
#include<string>
输入/输出:cin / cout
迭代器访问:str.begin()+xxx / str.end()
字符串连接:str=str1+str2
字符串比较:str1 == / != / <= / < / > / >= str2
字符串求长度:str.length()
字符串中插入字符/字符串:str.insert(pos号位置,字符串"xxx")
/ str.insert(str.begin()+xxx,str1.begin()+xxx,str1.end()+xxx)
字符串中删除:
删除字符:str.erase(str.begin()+xxx)
删除区间内字符串(包括端点):str.erase(str.begin()+xxx,str.end()-xxx)
/ str.erase(pos,length) 删除从pos(包括)位置开始的length个字符
清空字符串中的数据:str.clear()
返回字串:str.substr(pos,length
返回从pos号位(包括)开始长度为length的子串
查找子串:str.find(str1)
如果str1是str的字串返回其在str中第一次出现的位置
否则返回string::npos
/ str.find(str2,pos)
如果从pos(包括)开始的str1是str的字串返回其在str中第一次出现的位置
否则返回string::npos
题目
A.字符串连接
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
输入
每一行包括两个字符串,长度不超过100。
输出
可能有多组测试数据,对于每组数据,
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。输出连接后的字符串。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s1[105],s2[105],s[210];
while(cin>>s1>>s2)
{
int i=0,j=0;
while(s1[i]!='\0')
{
s[i]=s1[i];i++;
}
while(s2[j]!='\0')
{
s[i]=s2[j];i++;j++;
}
s[i]='\0' ;
cout<<s<<endl;
}
return 0;
}
用惯各种库函数以后做这道看简单的题也并没有自己想象中的顺利。思想很简单,两个循环将两个字符串相连再放到另一个字符串中。但要注意不能用string,要用char数组,还要注意C++方式的多样例输入。
字符串结尾处一定要赋'\0'。
B.单词替换
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入
多组数据。每组数据输入包括3行。第1行是包含多个单词的字符串 s,第2行是待替换的单词a,(长度<=100),第3行是a将被替换的单词b。(长度<=100)s, a, b 最前面和最后面都没有空格。
输出
每个测试数据输出只有 1 行,将s中所有a替换成b后的字符串。
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[1001];
while(gets(s)!=NULL)
{
char a[1001], b[1001];
char ans[1001][1001],r=0,c=0;
for(int i=0;i<=strlen(s); i++)
{
if(s[i]!=' ')
ans[r][c++] = s[i];
if(s[i]==' '||i==strlen(s))
{
ans[r][c]='\0';
r++;
c=0;
}
}
gets(a);
gets(b);
for(int i=0; i<r; i++)
{
if(strcmp(ans[i],a)==0)
strcpy(ans[i],b);
if (i==r-1)
puts(ans[i]);
else printf("%s ",ans[i]);
}
}
return 0;
}
这道题属于字符串基础题,直接求解即可,但需要掌握一些字符串输入输出的规则与值得注意的策略和方法。
1. puts(str)会在结尾输出'\n',printf("%s",str)不会换行。printf('%s\n',str)可以替换puts(str)。
2. scanf("%s",s)读入字符串,遇到空格就结束,故输入包含空格的字符串时,需要用 gets(s)。
3. 字符串多样例输入时通常以gets(s)输入换行为结束标志,即while(gets(s))。因为s是有空格的长字符串,所以时常利用s拆成一个一个的单词存到一个二维字符数组的行中,用二维数组存这个长字符串。
4. cin>>s遇到空格结束。若想读取有空格的字符串,可以使用cin.getline (s,N,'\n'),读N-1个字符或遇到换行结束。
C. 字符串去特定字符
输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。
输入
测试数据有多组,每组输入字符串s和字符c。
输出
对于每组输入,输出去除c字符后的结果。
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
char op;
int pos,i;
while(getline(cin,str)){
cin.get(op);
pos=0;
while(1){
pos=str.find(op);
if(pos==-1)
break;
str.erase(str.begin()+pos);
}
cout <<str<<endl;
getchar();
}
return 0;
}
这也是一道非常基础的题目,但是一直答案错误。原因就是不清楚用string时,多样例怎么输入,还有最后的输出问题,还有单个接收字符不能用cin。但根据这个代码开拓思路,可以利用find函数和erase函数进行循环不停删除相同字符或字符串。
string多样例输入要用getline(cin,str),单个字符输入要用cin.get(),cin输入会吞掉空格。