【问题标题】:The difference between cin.ignore and cin.synccin.ignore 和 cin.sync 的区别
【发布时间】:2012-05-22 01:25:07
【问题描述】:

cin.ignorecin.sync 有什么区别?

【问题讨论】:

    标签: c++ iostream


    【解决方案1】:

    cin.ignore 丢弃字符,直到指定的数量,或者直到达到分隔符(如果包括)。如果你不带参数调用它,它会从输入缓冲区中丢弃一个字符。

    例如,cin.ignore (80, '\n') 将忽略 80 个字符,或者在遇到换行之前忽略它所找到的所有字符。

    cin.sync 丢弃输入缓冲区中的所有未读字符。但是,不能保证在每个实现中都这样做。因此,如果您想要一致性,ignore 是更好的选择。

    cin.sync() 只会清除剩下的内容。我能想到的sync() 唯一不能用ignore 完成的用途是system ("PAUSE"); 的替代品:

    cin.sync(); //discard unread characters (0 if none)
    cin.get(); //wait for input
    

    cin.ignore()cin.get() 可能有点混合:

    cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n'); //wait for newline
    //cin.get()
    

    如果剩下换行符,只需输入ignore 似乎会跳过它。但是,如果没有换行符,两者都将等待两个输入。丢弃任何未读取的内容可以解决该问题,但同样不一致。

    【讨论】:

    • 你能告诉我cin.sync不安全的具体实现吗!
    • @5fox:我可以向您展示它不起作用的实现:ideone.com/AR8lB
    • ignore() 应该在 cin 之前还是 cin 之后调用?具体来说,当我第一次使用 cin 时,是否需要刷新缓冲区中不需要的数据(如果有)?还是在输入 main 时程序会刷新所有内容?但我注意到,如果我们调用ignore(),它会在第一次等待一些非空白字符。
    • @Rajesh,之后。程序启动时,输入缓冲区中不应包含随机内容。常见的用例是清除错误的用户输入或删除输入操作留下的换行符。
    • @chris Thaks 获取信息。为什么我下面的代码无法接受字符串?如果输入空字符串,我希望 while 循环向用户询问新字符串。代码不适用于空字符串或有效字符串。忽略()行看起来很困扰我,如果我删除忽略(),事情就会起作用。但是我担心以后会不会有麻烦,因为我没有刷新缓冲区。 void getString(string &str) { do { cout::max(),'\n'); } 而 (str.empty()); }
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多