簡體   English   中英

cin.ignore()在c ++中工作異常

[英]cin.ignore() works strangely in 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;
    }
}

好。 我不知道您想如何准確地讀取數據。 但是你編程做這個,

  • 當行短於或等於n時('\\ n'會計數)。 讀取一行,讀取並忽略下面的一行,完成值和工作。
  • 如果行較長,則會在cin對象中設置fail標志,並忽略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之后需要忽略?

提示:我也建議您創建輸入文件,並從命令行在程序的標准輸入上重定向文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM