输入输出的细节
- 细节一:当输入转行后又要使用getline()时,必须先使用getchar()吃掉前面的转行符'\n';
- 细节二:用getline()输入带空格字符串;
- 细节三:输出字符 ' " ' 时用cout << " \" "
补充:printf("%.2f%%\n", 100.0 * d[n] / f[n]); 打印百分号‘%’用%%
#include <iostream> using namespace std; #include <string> int main() { int n; while (cin >> n) { // 注意:接收完第一行的整数之后,必须要再接收下该行之后的空格,无法直接获取下一行 getchar(); string name; for (int i = 0; i < n; ++i) { // 接收一个用例,当找到','或者‘ ’时候补双引号 // 否则:输出 getline(cin, name); if (name.find(',') != string::npos || name.find(' ') != string::npos) { cout << "\"" << name << "\""; } else { cout << name; } // 注意:最后一个名字之后没有, if (i + 1 != n) cout << ", "; } cout << endl; } return 0; }
函数find()的用法
函数find()
1、对string的查找
int main() { string s="01234567"; cout<<"字符串为:"<<s<<endl; int pos0=s.find('3'); cout<<"查到的下标:"<<pos0<<endl; int pos1=s.find('a'); cout<<"未查到返回:"<<pos1<<endl; return 0; } 字符串为:01234567 查到的下标:3 未查到返回:-1
2、当pos为无符号整形size_t时
int main() { string s = "01234567"; cout << "字符串为:" << s << endl; size_t pos1 = s.find('a'); cout << "未查到返回:" << pos1 << endl; if (pos1 == -1) cout << 666 << endl; return 0; } 字符串为:01234567 未查到返回:4294967295 666
可见虽然是无符号导致值不为-1,但判断时会有整形提升导致依然可以判断成功
3、对于各种容器如果有s.find(容器内容) == s.end()则表示找不到
#include <iostream> using namespace std; #include <unordered_set> #include <string> int main() { // 循环处理每一组测试用例 string name; while (getline(cin, name)) { // 将第一行中的所有名字进行拆解,保存在unordered_set中,方便后序查找 unordered_set<string> s; size_t pos = 0; while (pos < name.size()) { // 该名字使用""包含了,将该名字截取出来 if (name[pos] == '\"') { size_t end = name.find("\"", pos + 1); s.insert(name.substr(pos + 1, end - pos - 1)); pos = end + 2;//跳掉后面的双引号和逗号 } else { // 该名字没有使用""包含,找到改名字的末尾后直接截取 size_t end = name.find(",", pos + 1); if (end == -1) { // 已经是最后一个名字了 s.insert(name.substr(pos, name.size() - pos)); break; } s.insert(name.substr(pos, end - pos)); pos = end + 1; //跳掉后面的逗号 } } // 接收第二行的名字,然后检测其是否在unordered_set中存在 getline(cin, name); if (s.find(name) == s.end()) { printf("Important!\n"); //没找到 } else { printf("Ignore\n"); //找到了 } } return 0; }