题目
分析
本题旨在让用户熟悉字符串的一些基本操作。
- 两个字符串拼接。C++可以用最直观的
+进行两个字符串的拼接。
string doc;
//... ...
string str;
cin >> str;
doc += str;
-
截取一部分,也就是获得子串。
str.substr(a, b)可以完成这个工作。它从str的位置a开始(包括这个位置),截取长度为b的一个字符串。例如:假定str="abcdefghi",那么str.substr(1,2)会返回"bc"(从位置1开始截取长度2的一个字符串)。 -
在中间插入。
str.insert(l, s)会在str的位置l之前插入字符串s。
下面是一个插入操作的例子:
string doc = "hello";
doc.insert(2, "abc"); // 在位置2,也就是'l'前插入"abc"
cout << doc << endl; // 输出: heabcllo
- 查找。一个最简单的应用是在
str中,从头找一个子字符串s:str.find(s)。如果能找到,那么会返回第一次出现s的位置。如果找不到,按照C++的语法规定,是返回一个string::npos,但在类似竞赛题目中,可以将其转换为int而输出将是-1。
答案

思考
str.find()还有另外一个形式,可以指定查找的起始位置,例如:str.find(s, pos),这样会从pos位置开始查找子字符串s。
string str = "abcabcabc";
size_t pos = str.find("abc", 3); // 从位置3开始查找"abc"
cout << pos << endl; // 输出3
pos = str.find("abc", 4); // 从位置4开始查找"abc"
cout << pos << endl; // 输出6
从这个思路出发,我们可以在一个字符串里找到所有"abc"的位置 。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str = "abcabcabc";
string pattern = "abc";
size_t pos = str.find(pattern);
while (pos != string::npos) {
cout << "Found at position: " << pos << endl;
pos = str.find(pattern, pos + 1);
}
return 0;
}
输出结果:
Found at position: 0
Found at position: 3
Found at position: 6
