2

入力する時間形式 hh:mm:ss が 2 つ指定されている場合があります。

非整数に達するまでint変数が抽出されることを私は知っています。cinこれは、時間を簡単に抽出できることを意味しますが、文字 ":" がストリームに残り、分を抽出する際に問題が発生します。

使用できることはわかってcin.ignore()いますが、2 つの時刻形式を入力する必要があるため、入力用のコードだけでは非常に長くなり、あまり良くないように見えます。

アイデアを与えるために:

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

An easy approach is create a colon() manipulator:

std::istream& colon(std::istream& in) {
    if ((in >> std::ws).peek() == ':') {
        in.ignore();
    }
    else {
        in.setstate(std::ios_base::failbit));
    }
    return in;
}

You can then just extract the ':' characters:

in >> h >> colon >> m >> colon >> s;

Obviously, I'd create an input operator for times so I could then read the two objects using

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 に答える