字符串分割与替换
字符串分割与替换
掌握字符串函数的使用:分割、替换。
分割按分隔符把一个串拆成若干段:用 find 定位分隔符,substr 取出两段之间的内容,再从分隔符后继续。也可以把串读进 stringstream,按空格或指定字符抽取。替换是把出现的某字符或某子串改成另一段:s[i] = c 换单字符;换子串则用 find 定位后 s.replace(pos, len, neu),或自己拼接左右两截。C++11 没有 Python 那样的 split 标准函数,三级要会用查找 + 截取组合出来。
客观题会给替换后的短串或「按逗号切开得到几段」。编程题常见:把分隔符改成空格再输出、把一种标点统一成另一种、按词统计。认证标准规定考试时长为 120 分钟,连续分隔符会不会产生空段,必须先对照题意。
string s = "red-green-blue", out;
for (int i = 0; i < (int)s.size(); ++i)
out += (s[i] == '-' ? ' ' : s[i]);
// out == "red green blue"
string t = "aa-bb";
size_t p = t.find('-');
string left = t.substr(0, p); // "aa"
string right = t.substr(p + 1); // "bb"
替换子串时注意新串比旧串长或短都会改变后续下标;从左到右替换且每次跳过新写入的部分,避免死循环。
执行下面 C++ 代码后将输出"China"。()
string a="china";
a.replace(0,1,"C");
cout<<a<<endl;
如果执行下面 C++ 代码后,输出的结果是“gesp ccf org cn”,则横线上应填入哪个代码?( )
#include <iostream>
using namespace std;
int main() {
string str = "gesp.ccf.org.cn";
string delimiter = ".";
string result="";
string token;
size_t found = str.find(delimiter);
while (found != string::npos) {
token = str.substr(0, found);
result += token;
result += " ";
__________________________ // 在此处填入代码
found = str.find(delimiter);
}
//最后一部分
result += str;
result += " ";
cout << result << endl;
return 0;
}
原文保真说明:来源改写 2 处(照原卷保留,未作修改)
来源题面被改写版式题干
原卷作
string result="";洛谷改了 result 赋值空格、while 花括号前空格、填空下划线,以及最后一部分 result += " " 的缩进;已按 PDF 第 6–7 页列位恢复。
已按官方原件恢复:现为原卷原文
来源题面被改写版式选项 2
原卷作
str = str.substr(found, str.length() );洛谷去掉了 str.length() 与 ) 之间的空格;已按 PDF 第 7 页恢复。
已按官方原件恢复:现为原卷原文
下列代码输出的是
string s="1234@@chenadai";
string str="12345";
s.replace(1,5,str);
cout<<s<<endl;
原文保真说明:来源改写 1 处(照原卷保留,未作修改)
来源题面被改写版式题干
原卷作
string s="1234@@chenadai";洛谷有题在运算符两侧加空格;已按官方 PDF 第 2 页列位恢复。
已按官方原件恢复:现为原卷原文
下面程序最后能够得到 HelloC++ 的是( )
int main() {
string str = "HelloWorld";
_______________________
cout << str;
return 0;
}