cin.ignore()在c ++中奇怪地工作

时间:2017-10-22 19:16:07

标签: c++

我是c ++的新手,这个功能给了我一些问题。在执行cin.ignore()时,程序会要求输入,当我按Enter键时,没有其他任何事情发生,程序就会停留在那里。 n总是9,c是少于9个字符的数组。

void LeerCadena(char *c, int n) {
    while (1) {
        cin.getline(c, n);
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        if (cin.fail()) {
            cout << "Introduce un dato valido" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }
        else return;
    }
}

1 个答案:

答案 0 :(得分:0)

确定。我不知道你想如何准确地读取数据。但是你的程序会这样做,

  • 当行短于或等于n时('\ n'计数)。读取行并读取并忽略下面的一行,并完成值和工作。
  • 如果行更长,则在cin对象中设置失败标志,并忽略cin.ignore()。然后清除cin(所有标志都关闭),并忽略更长的行。并且循环确实继续。

因此程序会等待比n个字符短的行。并忽略它之后的一行。

问题

如果缺少新的换行符,它将永远循环。该流有3个标志,表示流被破坏。 Failbit,eofbit和badbit。 cin.good()没有给出这些位是真的。

所以!cin.good()看起来比cin.fail()更好,但这并不容易。如果是eof,clean()和ignore()会给你另一个eof。所以它可能就是这样。

void LeerCadena(char *c, int n) {
    while (1) {
        cin.getline(c, n);
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        if (cin.fail()) {
            cout << "Introduce un dato valido" << endl;
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        } else if(!cin.good()){
            cerr << "LeerCadena failed!" << endl;
            return;
        }
        else return;
    }
}

但是你不知道哪个函数失败了是getline还是忽略。

我真的建议你制作getline,然后询问发生了什么。为什么你需要在getline之后忽略?

提示:我还建议您从命令行在标准的程序输入上创建输入文件和重定向文件。