使用cin.ignore和cin.clear CPP时的奇怪行为

时间:2017-02-26 10:11:09

标签: c++ cin

我了解到strtok清除了错误标志,因此cin操作可以正常运行,cin.clear()可以从流中提取字符。 所以我尝试了这段代码:

cin.ignore()

效果很好。 对于三个输入:

#include <iostream>
#include <string>
int main()
{
    std::string s;
    std::cin >> s;
    std::cout << s;
    std::cin.clear();
    std::cin.ignore(1000, '\n');
    std::getline(std::cin, s);
    std::getline(std::cin, s);
    std::cout << s;
    system("pause");
    return 0;
}

输出将是:

I
AM
TRY

但如果我将其改为:

I 
TRY

我需要输入四个输入!

当我添加上面的代码时,我需要输入:

,这有什么意义呢?
#include <iostream>
#include <string>
int main()
{
    std::string s;
    std::cin >> s;
    std::cout << s;
    std::cin.clear();
    std::cin.ignore(1000, '\n');
    std::getline(std::cin, s);
    std::cin.clear(); // New code
    std::cin.ignore(1000, '\n');  // New code
    std::getline(std::cin, s);
    std::cout << s;
    system("pause");
    return 0;
}

要获得相同的输出?出于某种原因,它需要更多输入。

1 个答案:

答案 0 :(得分:1)

考虑每次都输入I AM TRY NOW

#include <iostream>
#include <string>
int main()
{
    std::string s;
    std::cin >> s;
    std::cout << s; //-> outputs "I"
    std::cin.clear();
    std::cin.ignore(1000, '\n');//consumes all that follows "I"
    std::getline(std::cin, s); //-> get the whole "I AM TRY NOW" inside s
    std::cin.clear(); 
    std::cin.ignore(1000, '\n');  //Your cin is empty (because you took the whole line with getline(), not just part of the line, the stream has no character left in it and this cin.ignore() call is the reason you need 1 more input, because calling cin.ignore() en empty stream does that.
    std::getline(std::cin, s); //-> overwrites the previous std::getline(std::cin, s);
        std::cout << s; //outputs the whole line : "I AM TRY NOW"
        system("pause");
        return 0;
}

因为您在空流上调用cin.ignore(1000, '\n');,所以您可以再使用第二个代码示例获得一个输入。 试试这个

int main()
{
    std::string s;
    std::cin.ignore(1000, '\n');  // New code
system("pause");
}

这需要输入,而这个:

int main()
{
    std::string s;
    cin >> s;
    std::cin.ignore(1000, '\n');  // New code
    system("pause");
}

如果您输入I,换行将是丢弃的字符,如果您输入I AM TRY然后AM TRY并且新行将被丢弃,则还需要输入一个

int main()
{
    std::string s;
    cin >> s;
    std::cin.ignore(1000, '\n');  // New code
    std::cin.ignore(1000, '\n');  // requires second input
    system("pause");
}

需要两个输入,因为在第二次cin.ignore调用时,有一个空的cin stram。