2013-09-26 196 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)));} 

注:該代碼有除非用戶輸入一些其他字符而不是':'沒有影響。對於其他情況應該沒問題。我不確定我是否回答了您的問題,但我希望這會有所幫助。

相關問題