【问题标题】:time format hh:mm:ss input时间格式 hh:mm:ss 输入
【发布时间】:2013-09-26 18:43:58
【问题描述】:

我有两种时间格式 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 会自动忽略空格。有没有办法让它自动忽略特定字符(在本例中为字符“:”)?

【问题讨论】:

  • 您是在寻找一种从字符串中读取时间的算法,还是您想自己做?使用 boost 会有问题吗?
  • @Lainezor 使用不同的分隔符作为空格??
  • @itwasntpete 我实际上想避免使用字符串。但我会很高兴有任何比 11 行代码更紧凑的任务解决方案。编辑:对不起,我忘了,我不想要 Boost 的解决方案。
  • 阅读第二个答案...这正是您所需要的。

标签: c++ cin


【解决方案1】:

一个简单的方法是创建一个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;

【讨论】:

    【解决方案2】:

    就我而言,我还需要以 HH:MM:SS 格式输入时间。我通过将':' 输入用作getline()function 的分隔符来解决它。我在这里附上了那部分代码。

    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)));}
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2019-07-13
      相关资源
      最近更新 更多