

要求:
分析:
这道题是要做字符串切割。
#include
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// 前提:str一定输入正确
// 功能:以i为止,返回'"'的索引(一定能够找到)
int find_char(std::string str, int i){
int j = i; // 说明遇到的是待_的字符串
while (j < str.size() && str[j] != '"'){
j++;
}
return j + 1;
}
// 从索引i开始,找到下一个不是_的索引
int find_nChar(std::string str, int i){
int j = i; // 说明遇到的是待_的字符串
while (j < str.size() && str[j] == '_'){
j++;
}
return j;
}
// 找下一个不是字母和字符串的位置
int find_nAlNum(std::string str, int i){
int j = i;
while (j < str.size() && isalnum(str[j])){
j++;
}
return j;
}
void split(std::string str, int k){
int i = 0;
std::vector<std::string> vec;
while (i < str.size()){
if(str[i] == '"'){ //已经确保了一定会有偶数个""
if(str[i + 1] == '"' ){ // 说明遇到的一定是空字符串
vec.emplace_back("\"\"");
i = i + 2;
}else{ // 说明遇到的是待_的字符串
int j = find_char(str, i + 1);
vec.push_back(str.substr(i, j - i));
i = j;
}
}else if(str[i] == '_'){
// 跳过接下来连续的_
i = find_nChar(str, i + 1);
vec.emplace_back("_");
}else{ //遇到的是密码
int j = find_nAlNum(str, i +1); // 当前j执行一个非alnum
vec.push_back(str.substr(i, j - i));
i = j;
}
}
std::string res_str;
int p = 0;
for (int j = 0; j < vec.size(); ++j) {
if(vec[j] == "_"){
if(j == 0 || j == vec.size() - 1){
}else{
res_str += "_";
}
}else if(p == k){
res_str += "******";
p++;
}else{
res_str += vec[j];
p++;
}
}
if(p >= k){
std::cout << res_str << "\n";
}else{
std::cout << "ERROR" << "\n";
}
}
int main() {
int k;
std::string str;
std::cin >> k;
std::cin >> str;
split(str, k);
return 0;
}