我遇到两种时间格式hh:mm:ss to input。
我知道int
个变量从cin
开始,直到达到非整数。这意味着我可以轻松地提取小时数,但是字符“:”仍然会在流中,这会导致提取分钟的问题。
我知道我可以使用cin.ignore()
,但由于我必须输入两种时间格式,因此输入的代码会导致很长时间并且看起来不太好。
只是为了给你一个想法:
int h,m,s, h2,m2,s2;
cin>>h;
cin.ignore();
cin>>m;
cin.ignore();
cin>>s;
cin>>h2;
cin.ignore();
cin>>m2;
cin.ignore();
cin>>s2;
我知道cin会自动忽略空格。有没有办法让它自动忽略特定字符(在这种情况下,字符“:”)?
答案 0 :(得分:3)
一种简单的方法是创建一个colon()
操纵器:
std::istream& colon(std::istream& in) {
if ((in >> std::ws).peek() == ':') {
in.ignore();
}
else {
in.setstate(std::ios_base::failbit));
}
return in;
}
然后,您只需提取':'
字符:
in >> h >> colon >> m >> colon >> s;
显然,我会创建一个输入操作符,以便我可以使用
读取这两个对象in >> time1 >> time2;
答案 1 :(得分:0)
对于我的情况,我还需要以HH:MM:SS格式输入时间。我通过将':'
输入用作getline()
函数的分隔符来解决该问题。我在这里附上了这部分代码。
const char delim = ':';
string hr_s, min_s, sec_s;
int hr, min, sec;
cout << "Enter HH:MM:SS : " << endl;
std::getline(cin, hr_s, delim);
std::getline(cin, min_s, delim);
std::getline(cin, sec_s);
hr = stoi(hr_s);
min = stoi(min_s);
sec = stoi(sec_s);
if ((hr_s.length() == 2) && (min_s.length() == 2) && (sec_s.length() == 2)&& (isValidTime(hr, min, sec)))
{
cout << "Good Time Format" << endl;
}
else
{
cout << "Bad Time format input"<< endl;
}
检查数字输入有效性的方法:
bool isValidTime(int hr, int min, int sec)
{return (((hr >= 0) && (hr < 24)) &&
((min >= 0) && (min < 60)) &&
((sec >= 0) && (sec< 60)));}
注意:除非用户输入其他字符而不是':'
,否则此代码无效。对于其他情况,它应该没问题。我不确定我是否回答了你的问题,但我希望这有用。