C++ 时间格式hh:mm:ss输入

C++ 时间格式hh:mm:ss输入,c++,cin,C++,Cin,在这种情况下,我会得到两种时间格式hh:mm:ss来输入 我知道int变量从cin中提取,直到达到非整数。这意味着我可以很容易地提取小时数,但是字符“:”仍将在流中,这将导致提取分钟数的问题 我知道我可以使用cin.ignore(),但由于我必须输入两种时间格式,因此仅用于输入的代码将非常长,而且看起来不太好 给你一个想法: int h,m,s, h2,m2,s2; cin>>h; cin.ignore(); cin>>m; cin.ignore(); cin>&g

在这种情况下,我会得到两种时间格式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会自动忽略空白。有没有办法让它自动忽略一个特定的字符(在本例中是“:”?

一个简单的方法是创建一个
冒号()
操纵器:

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;
显然,我会为times创建一个输入操作符,这样我就可以使用

in >> time1 >> time2;

对于我的情况,我也需要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;
    }
const char delim=':';
字符串hr\u s、min\u s、sec\u s;
内时,分钟,秒;

你们是在寻找一种从字符串中读取时间的算法,还是想自己去做?使用boost会有问题吗?这个例子应该可以用:)@Lainezor使用不同的分隔符作为空格???@itwasntpet我实际上想避免使用字符串。。但是我会很高兴能找到比11行代码更紧凑的解决方案。编辑:对不起,我忘了,我不想用Boost解决。请阅读第二个答案。。。这正是你需要的。
bool isValidTime(int hr, int min, int sec)
{return (((hr >= 0) && (hr < 24)) &&
    ((min >= 0) && (min < 60)) &&
    ((sec >= 0) && (sec< 60)));}