2

我有两种时间格式 hh:mm:ss 输入的情况。

我知道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 会自动忽略空格。有没有办法让它自动忽略特定字符(在这种情况下,字符“:”)?

4

2 回答 2

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;
于 2013-09-26T18:59:24.573 回答
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)));}

注意:此代码无效,除非用户输入其他字符而不是':'. 对于其他情况应该没问题。我不确定我是否回答了你的问题,但我希望这会有所帮助。

于 2016-06-15T17:13:03.283 回答