Loading... CSP 201403-3 ```C++ #include <bits/stdc++.h> using namespace std; const int N = 30; bool o1[N], o2[N]; // 分别代表无参数选项,有参数选项 string ans[N]; int main() { memset(o1, false, sizeof o1); memset(o2, false, sizeof o2); string str; cin >> str; for (int i = 0; i < str.size(); i++) { if (i + 1 < str.size() and str[i + 1] == ':') o2[str[i] - 'a'] = true, i++; else o1[str[i] - 'a'] = true; } int n; cin >> n; getchar(); // 读掉换行符 for (int i = 0; i < n; i++) { for (int j = 0; j < 26; j++) ans[j].clear(); getline(cin, str); stringstream ss(str); vector<string> ops; while (ss >> str) ops.push_back(str); for (int j = 1; j < ops.size(); j++) { if (ops[j][0] != '-' or ops[j][1] < 'a' or ops[j].size() != 2) break; int k = ops[j][1] - 'a'; if (o1[k]) ans[k] = '*'; else if (o2[k] and j + 1 < ops.size()) ans[k] = ops[j + 1], j++; else break; } printf("Case %d:", i + 1); for (int j = 0; j < 26; j++) { if (ans[j].size()) { cout << " -" << (char)(j + 'a'); if (o2[j]) cout << ' ' << ans[j]; } } cout << endl; } return 0; } ``` 如果是处理非空格分隔的多行字符串,每行又有多个字符串这种循环输入时,就要更麻烦一点: > 链接:https://ac.nowcoder.com/acm/contest/320/J > 题目描述 > 对输入的字符串进行排序后输出 > 输入描述: > 多个测试用例,每个测试用例一行。 > 每行通过,隔开,有n个字符,n<100 > 输出描述: > 对于每组用例输出一行排序后的字符串,用','隔开,无结尾空格 > 示例1 > 输入 > a,c,bb > f,dddd > nowcoder > 输出 > a,bb,c > dddd,f > nowcoder > (1) 处理多行的方式是每次用geline读入一行,如果读到空行说明全部读完了,退出循环。而处理单独的一行的方式是用正则表达式,以,作为分隔符,那么匹配模式就是 [^,]+。代码如下: ```c++ #include <bits/stdc++.h> using namespace std; int main() { string str; while(true) { getline(cin, str); if(str.empty()) break; regex re(R"([^,]+)"); vector<string> v; for(sregex_token_iterator it(str.begin(), str.end(), re), end; it != end; it++) { v.emplace_back(*it); } sort(v.begin(), v.end()); int n = v.size(); for(int i = 0; i < n - 1; i++) cout << v[i] << ','; cout << v[n-1] << endl; } return 0; } ``` 但是C++的正则表达式处理似乎有些耗时,对于时间限制高的题目来说这样并不合适。 (2) 使用stringstream ```C++ #include <bits/stdc++.h> using namespace std; int main() { string str; while(true) { getline(cin, str); if(str.empty()) break; vector<string> v; /*使用stringstream分隔的核心代码*/ stringstream ss; ss << str; string tmp; while(getline(ss, tmp, ',')) { v.emplace_back(tmp); } /*使用stringstream分隔的核心代码*/ sort(v.begin(), v.end()); for(int i = 0; i < v.size() - 1; i++) cout << v[i] << ','; cout << v.back() << endl; } return 0; } ``` stringstream可以方便地分割字符串,并且在任意类型之间转换。需要包含`<sstream>`头文件。 基本用法: 首先将一个string类的对象 str 放到 stringstream类的对象 ss 中,然后再根据需要将其中的内容输出到指定的变量中。 ```C++ #include <string> #include <sstream> #include <iostream> using namespace std; int main() { string str("Hello World 123"); stringstream ss; ss << str; string a, b; int c; ss >> a >> b >> c; cout << a << " " << b << " " << c << endl; return 0; } 同样的,也可以用来把数字转换成字符串(也可以直接用to_string()方法) #include <string> #include <sstream> #include <iostream> using namespace std; int main() { int a = 1234; stringstream ss; ss << a; string str; ss >> str; cout << str << endl; return 0; } ``` 需要注意的是,如果重复使用一个stringstream对象,需要在对它进行新的 << 赋值操作时,先执行 .clear()方法。否则流中的内容不会改变。因为stringstream对象的构造和析构非常耗时,通常需要复用同一个对象,因此必须记住要执行.clear()方法。 ```C++ #include <string> #include <sstream> #include <iostream> using namespace std; int main() { int a = 1234; stringstream ss; ss << a; string str; ss >> str; cout << str << endl; int b = 0; ss.clear(); // 重要!否则ss中的内容不会改变 ss << b; ss >> str; cout << str << endl; return 0; } ``` 回到这一题,使用的是 `istream& getline(istream& input, string& str, char delim)` getline函数从输入流(input)读取字符放进string(str),直到出现下一个字符是分隔字符delim时,会取出这个分隔符,但是不会将它附到str后面,然后返回。它的返回值是input对象,放到while()里作为条件时,如果整个输入流被处理完,那么就返回0,否则返回的是一个非零的地址(input的this指针),类型转换为true。因此,可以使用 while(getline(input,str, delim)) 这种方式,持续分割 input 并输出到 str 中进行后续处理,直到 input 被分割完。 通常读取一行使用的 getline(cin, str),使用的是默认的分隔符 '\n',这也解释了为什么 getline(cin, str)能够将输入缓冲区的 '\n' 取出,事实上getline会取出 delim指定的分隔符。 最后修改:2022 年 09 月 24 日 10 : 33 PM © 转载自他站 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信
10 条评论
?国际化视角评语?
哈哈哈,写的太好了https://www.lawjida.com/
每次看到你的文章,我都觉得时间过得好快。 http://www.55baobei.com/jlFdx4jqjx.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/ph3hGFyQXZ.html
《窥视者》欧美剧高清在线免费观看:https://www.jgz518.com/xingkong/104996.html
不错不错,我喜欢看 www.jiwenlaw.com
看的我热血沸腾啊www.jiwenlaw.com
想想你的文章写的特别好https://www.ea55.com/
怎么收藏这篇文章?
看的我热血沸腾啊