今天要刷一刷字符串的类型题,在机试中总是会涉及到,而且属于简单题,所以应该是必须要做出来的那种。
最好用的就是String模板了
#include<string>
下面列出来主要的几个string函数:
a) =,assign() //赋以新值
b) swap() //交换两个字符串的内容
c) +=,append(),push_back() //在尾部添加字符
d) insert(t,a) //插入字符,在t下标的位置之前插入字符串a
e) erase(t,a.size()) //删除字符,删除从t位置开始,长度为a.size()的字符串
f) clear() //删除全部字符
g) replace(t,a.size(),b) //将从t位置开始,长度为a.size()的字符串替换为b
h) + //串联字符串
i) ==,!=,<,<=,>,>=,compare() //比较字符串
j) size(),length() //返回字符数量
k) max_size() //返回字符的可能最大个数
l) empty() //判断字符串是否为空,是空时返回ture,不是空时返回false
有几点要注意:
一般先定义 char str[200];
然后用 gets(str);读入 (另外在vs2015之后的 版本要用gets_s,在各种oj平台上要用gets)
然后再转换成string类型 string a=str;
下面看几个例子
例一:九度1168
-
题目描述:
-
给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
-
输入:
-
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
-
输出:
-
删除输入的短字符串(不区分大小写)并去掉空格,输出。
-
样例输入:
-
in #include int main() { printf(" Hi "); }
-
样例输出:
-
#clude tma() { prtf("Hi"); }
#include<stdio.h>
#include<string>
#include<iostream>
#include<ctype.h>
using namespace std;
int main() {
char str[101];
gets_s(str);
string a = str;
int i, j;
for (i = 0; i < a.size(); i++) {
a[i] = tolower(a[i]);
}
while (gets_s(str)) {
string b = str;
string c = b;
for (i = 0; i < b.size(); i++) {
b[i] = tolower(b[i]);
}
int t = b.find(a, 0); //从b的第0个位置开始找字符串a
while (t != string::npos) { //若查找成功 则循环
b.erase(t, a.size()); //删除从t位置开始 长度为a.size()的字符串
c.erase(t, a.size());
t = b.find(a, 0);
}
t = c.find(' ', 0); // 查找原字符串中的空格
while (t != string::npos) {
c.erase(t, 1); // 删除空格
t = c.find(' ', 0);
}
cout << c << endl;
}
}
例二 九度1111
-
题目描述:
-
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
-
输入:
-
多组数据。每组数据输入包括3行,第1行是包含多个单词的字符串 s,第2行是待替换的单词a,(长度<=100)第3行是a将被替换的单词b。(长度<=100)s, a, b 最前面和最后面都没有空格.
-
输出:
-
每个测试数据输出只有 1 行,将s中所有单词a替换成b之后的字符串。
-
样例输入:
-
You want someone to help you You I
样例输出:
-
I want someone to help you
替换的是单词,如果
Youwant someone to help you
You
I
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int main() {
char str[101];
while (gets_s(str)) { //注意在vs2015编译器下是get_s,但是在其他oj上提交的时候用gets
string a = str;
gets_s(str); //注意gets和puts只能用于char类型的字符串
string b = str;
gets_s(str);
string c = str;
int i, j;
int t = a.find(b, 0); //在字符串a中从头开始寻找b字符串
while (t != string::npos) {
if ((t == 0 || a[t - 1] == ' ') && (a[t + b.size()] == ' '|| t + b.size()==a.size())) {
a.erase(t, b.size());
a.insert(t, c);
//以上两行也可以用replace代替
a.replace(t, b.size(), c);
}
t = a.find(b, t+1);
}
cout << a << endl; //注意string类型的字符串只能用cout或printl输出
}
}
例三 POJ2934
-
描述
- 有两个字符串str和substr,str的字符个数不超过10,substr的字符个数为3。(字符个数不包括字符串结尾处的'\0'。)将substr插入到str中ASCII码最大的那个字符后面,若有多个最大则只考虑第一个。 输入
-
输入包括若干行,每一行为一组测试数据,格式为
str substr
输出
- 对于每一组测试数据,输出插入之后的字符串。 样例输入
-
abcab eee 12343 555
样例输出
-
abceeeab 12345553
#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
int findmax(string a) {
int max=a[0];
int t=0;
for (int i = 0; i < a.size(); i++) {
if (a[i] > max) {
max = a[i];
t = i;
}
}
return t;
}
int main() {
char str[11];
char substr[4];
while (scanf("%s %s", str, substr)!=EOF) {
string a = str;
string b = substr;
int t = findmax(a);
a.insert(t + 1, b);
cout << a<<endl;
}
}