2013-09-26 160 views
1

我在这种情况下,当我给两个时间格式hh:mm:ss输入。时间格式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自动忽略空格。有没有办法让它自动忽略一个特定的字符(在这种情况下,字符“:”)?

+0

你是在寻找一个从字符串中读取时间的算法,还是你想自己做?会使用提升问题? – user1810087

+1

http://stackoverflow.com/questions/236129/splitting-a-string-in-c这个例子应该工作:) – Lainezor

+0

@Linezor用不同的分隔符作为空白? –

回答

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; 
0

Fo我的情况也需要时间输入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)));} 

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

相关问题