练习 9.51
在原题的基础上自己小拓展了一下,能够处理种类变多了。
#include<iostream>
#include<string>
#include<vector>
#include<cstdio>
#include<map>
#include<string>
#include<set>
#include<unordered_set>
#include<unordered_map>
using namespace std;
class Data{
unsigned year;
unsigned month;
unsigned day;
unordered_map<string,int> month_list ={ {"January",1}, {"February",2}, {"March",3}, {"April",4}, {"May",5},
{"June",6,}, {"July",7}, {"August",8}, {"September",9}, {"October",10}, {"November",11}, {"December",12}}; //有数组也行
public:
Data() = default;
Data(const string &s){
//先分割,然后按顺序处理,输入顺序必须是月,日,年
const string limit = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm0123456789"; //符合要求的字符,其实可以精简下只有月份单词中的字母即可
vector<string> s_data ;//年月日
string sub_s = s;
sub_s.insert(sub_s.size()," "); //解决while判断最后一个会读取不到问题
while(sub_s.find_first_not_of(limit,0)!=string::npos){ //当然用双指针的思想也可以,不过我这里偷懒一下啦,这里这么写是因为
//能处理不止三组数据。并且能够判断除空格,点以外类型的分割,不过在这里没什么用
string tmp = sub_s.substr(sub_s.find_first_of(limit),sub_s.find_first_not_of(limit));
if(!tmp.empty())
s_data.push_back(tmp);
sub_s = sub_s.substr(sub_s.find_first_not_of(limit,0)+1,sub_s.size());
}
if(month_list[s_data[0]])
month = month_list[s_data[0]];
else{
if(s_data[0].find_first_not_of("0123456789")!=string::npos)
return; //比如输入January,不小心输了Janu,就会炸,不过不知道到该不该抛出异常,就先return了
else
month = stoi(s_data[0]);
}
year = stoi(s_data[2]);
day = stoi(s_data[1]);
};
void print_Data(){
std::cout << year << " " << month << " " << day << std::endl;
}
};
int main(){
Data a("12,,,1,,1998");
s.print_Data(); //结果正确
Data b("September /,1/1998");
s.print_Data(); //结果正确
Data s("S /,1/1998");//如何处理这种有错的数据不太懂
s.print_Data();
}
主要还剩要处理下Data s(“S /,1/1998”)这种数据,网上查了下说是有两种办法,一种是抛出异常,另一种是两段式的构造函数。