формат времени чч:мм:сс ввод

Я нахожусь в случае, когда мне дается два формата времени чч: мм: сс для ввода.

Я знаю, что переменные 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 автоматически игнорирует пробелы. Есть ли способ заставить его автоматически игнорировать определенный символ (в данном случае символ ":")?


person user2653125    schedule 26.09.2013    source источник
comment
вы ищете алгоритм чтения времени из строки или хотите сделать это самостоятельно? будет использовать повышение проблемы?   -  person user1810087    schedule 26.09.2013
comment
stackoverflow.com/questions/236129/splitting-a-string -in-c Этот пример должен работать :)   -  person Lainezor    schedule 26.09.2013
comment
@Lainezor С другим разделителем в качестве пробела ??   -  person πάντα ῥεῖ    schedule 26.09.2013
comment
@itwasntpete На самом деле я хотел избежать использования строки ... но я был бы доволен любым решением этой задачи, которое было бы более компактным, чем 11 строк кода. РЕДАКТИРОВАТЬ: Извините, я забыл, мне не нужно решение с Boost.   -  person user2653125    schedule 26.09.2013
comment
Читайте второй ответ... Это именно то, что вам нужно.   -  person Lainezor    schedule 26.09.2013


Ответы (2)


Простой подход — создать манипулятор 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;
person Dietmar Kühl    schedule 26.09.2013

В моем случае также мне нужен ввод времени в формате ЧЧ:ММ:СС. Я решил этот ввод ':', используя его в качестве разделителя для функции 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)));}

Примечание: этот код не действует, если пользователь не введет другой символ вместо ':'. Для другого случая это должно быть хорошо. Я не уверен, ответил ли я на ваш вопрос или нет, но я надеюсь, что это будет полезно.

person user3693028    schedule 15.06.2016