web-dev-qa-db-ja.com

getline()はclear()の後でも最初にスキップします

したがって、最初のgetlineをスキップして、2番目のgetlineに直接移動する関数があります。バッファをクリアしようとしましたが、それでも運がありません。どうなっているのでしょうか。

void getData(char* strA, char* strB)
{
    cout << "Enter String 1: ";               // Shows this line
    cin.clear();
    cin.getline(strA, 50);                    // 50 is the character limit, Skipping Input

    cout << endl << "Enter String 2: ";       // Showing This Line
    cin.clear();
    cin.getline(strB, 50);                   // Jumps Straight to this line
}
10
Derp

_cin >> str_を使用していないことを確認してください。関数を呼び出す前に。 _cin >> str_を使用してからgetline(cin, str)を使用する場合は、前にcin.ignore()を呼び出す必要があります。

_string str;
cin >> str;
cin.ignore(); // ignores \n that cin >> str has lefted (if user pressed enter key)
getline(cin, str);
_

C文字列を使用する場合:

_char buff[50];
cin.get(buff, 50, ' ');
cin.ignore();
cin.getline(buff, 50);
_

[〜#〜] add [〜#〜]:あなたの間違いはおそらく関数自体にあるのではなく、before関数を呼び出します。ストリームcinは、最初の_\n'_の改行文字_cin.getline_のみを読み取る必要があります。

14
user586399

cin.clear();はストリーム上のエラービットをクリアします-保留中の可能性のあるデータを消費しません。

cin.ignore()を使用して、ストリームからのデータを消費します。

1
Michael Burr

何かを読んだ後も、bufor内に「RETURN」文字が残っているため、読み取るたびにcin.ignore()する必要があります。

cin.sync()を使用してストリームをクリアすることもできます。実際にclearメソッドはフラグをクリアするだけです。

ストリームの最後に移動できるオプションもあります。読み取りに何も残さずに、問題なく書き込む必要があります。

std::cin.seekg(0, std::ios::end);

何を使うかはあなた次第です。

0
Krzychu8

use cin.ignore(-1);入力文字列の最初の文字は削除されません

0
Sukeshini