Отсутствие ввода с клавиатуры после использования cin.getline () в C ++ - PullRequest
0 голосов
/ 14 июля 2020

В приведенной ниже программе он отлично работает, когда я ввожу строку длиной меньше или равной 10, но когда я превышаю длину строки, getline работает нормально, но последующий оператор ввода не будет работать (не принимая ввод) / * использован правильный заголовок * /

int main () 
{
int a,b;
char s[10];
cin>>a;  //work fine
cin.ignore(); 
cin.getline(s,10); // work fine but if the length of string is more than 10...

cin>>b;  //...this line doesn't work
cout<<"a="<<a<<"s="<<s<<" b="<<b;
getch();
}

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вот ваше решение:

#include <climits>
#include <iostream>
using namespace std;

int main() {
    int  a, b;
    char s[11]; // <-- Size should be 11, the last character will be '\0'
    cin >> a;
    cin.ignore(); // better change it to cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.getline(s, 11); // <-- this line sets failbit if the input exceeds 10 characters

    // add these lines :
    if (!cin) { // <-- checks if failbit is set
        cin.clear(); // <-- clears the set flags
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- ignores the whole line
    }
    // if anything had gone bad, it has been fixed by now

    cin >> b;
    cout << "a = " << a << "\ns = " << s << "\nb = " << b;
}

Более сложный, но лучший:

#include <climits>
#include <iostream>
using namespace std;

int main () 
{
    cin.exceptions(ios_base::failbit|ios_base::badbit); // <-- tells compiler to treat failbit and badbit as exceptions
    int a, b;
    char s[11];
    cin >> a;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    try {
        cin.getline(s, 11);
    } catch (ios_base::failure &e) {
        // cerr << e.what() << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    cin >> b;
    cout << "a = " << a << "\ns = " << s << "\nb = " << b;
}
0 голосов
/ 14 июля 2020

Простое решение, используйте scanf("%[^\n]",s) вместо

Он считывает всю строку в массив, пока вы не нажмете клавишу Enter. Вы можете изменить его как хотите. Просто замените '\ n' символом, который должен быть концом ввода.

Вот как в вашем случае:

    int main () {

        int a,b;
        char s[10];

        cin>>a; 
        cin.ignore(); 
        scanf("%[^\n]",s);
        cin>>b;      

        cout<<"a="<<a<<"s="<<s<<" b="<<b;

        return 0;

    }
...