加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C:如何从cin中删除错误的输入?

发布时间:2020-12-16 09:48:09 所属栏目:百科 来源:网络整理
导读:我做了一些cin操作,在使用cin之前我想清除它的状态和 冲洗它.我该怎么做?我知道cin.clear()会清除错误状态,但要清除cin 缓冲区如何检查它是否为空,如果不是,我将使用哪个以下语句清空它以便以后可以安全地使用cin? cin.ignore(std::numeric_limitsstd::str
我做了一些cin操作,在使用cin之前我想清除它的状态和
冲洗它.我该怎么做?我知道cin.clear()会清除错误状态,但要清除cin
缓冲区如何检查它是否为空,如果不是,我将使用哪个以下语句清空它以便以后可以安全地使用cin?

cin.ignore(std::numeric_limits<std::streamsize>::max());

要么

cin.ignore(std::numeric_limits<std::streamsize>::max(),'n');

解决方法

看来,你发现了一个问题并想要摆脱错误的输入,例如输入的行.您可以尝试去除std :: cin在其缓冲区中的内容,但通常情况下,这不能很好地工作,因为无法保证流已读取,例如完整的行.另外,为了使它可能有用,你需要确保stdin和std :: cin不同步,否则std :: cin永远不会缓冲任何字符:

std::ios_base::sync_with_stdio(false);
// read data using std::cin

if (!std::cin) {
    // clean-up
    std::cin.clear();
    if (std::cin) {
        std::cin.ignore(std::cin.rdbuf()->in_avail()); // ignore what is buffered
    }
}

in_avail()是否将返回非零值完全取决于使用的流缓冲区,并且它可能忽略了比实际想要忽略的更多.例如,如果替换std :: cin的流缓冲区以使用std :: istringstream的流缓冲区,它可能会消耗此源中的所有字符.

可能最明智的清理是忽略()下一个字符或当前行上的字符,使用其中任何一个

std::cin.ignore();

要么

std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'n');

std :: streamsize的max()用作一个神奇的数字,表示该计数不应被视为终止标准.如果您没有传递终止字符,则流将忽略字符,直到流的末尾可能不是您想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读