Newsgroup: it.comp.lang.c++
Titolo: Problemi con getline()

Ho uno stupido problema che non riesco a capire perchè si crea e tantomeno a
risolvere.
In un programma invio a cout una serie di linee che permettono all' utente
di scegliere l'azione da eseguire immettendo un numero da 1 a 4. Ovviamente
dopo c'è un controllo della validità dell'input per evitare che l'utente
mandi in palla il programma immettendo caratteri a caso o numeri troppo
grandi.
Il problema sta nel fatto che dopo avere eseguito l'azione richiesta il
programma va una seconda volta a stampare il menu di cui sopra per chiedere
una nuova azione da fare, ma al contrario di quanto mi aspetto non si ferma
per accettare l'input dato dall'utente ma va avanti con la validazione di
non so cosa ed ovviamente trova caratteri non validi ed esce.
Segue un estratto del programma per chi voglia aiutarmi a capire che cosa ho
combinato.
Ringrazio anticipatamente tutti coloro che risponderanno.
Ciao,
Fabio.
...
...
template<typename T>
void testList(List<T> &listObject, const char *type)
{
    cout << "Testing a list of " << type << " values\n";
    int choice;
    T value;
    do
    {
        instructions();
 
        char buff [25];
        char *end_ptr;
        long long_var;
        errno = 0;
        cin.getline(buff,sizeof(buff));
        long_var = strtol(buff, &end_ptr, 0);
        if (ERANGE == errno)
        {
            cout << ("number out of range\n");
            break;
        }
        if (end_ptr == buff)
        {
            cout << "not valid numeric input\n";
            break;
        }
        choice = atoi(buff);
        switch (choice)
        {
        case 1:
            cout << "Enter " << type << ": ";
            cin >> value;
            if (!listObject.insertAtFront(value))
            {
                cout << "Memory exhausted ... exiting now!\n";
                exit(1);
            }
            listObject.print();
            break;
        case 2:
            cout << "Enter " << type << ": ";
            cin >> value;
            if (!listObject.insertAtBack(value))
            {
                cout << "Memory exhausted ... exiting now!\n";
                exit(1);
            }
            listObject.print();
            break;
        case 3:
            if (listObject.removeFromFront(value))
                cout << value << " removed from list\n";
            listObject.print();
            break;
        case 4:
            if (listObject.removeFromBack(value))
                cout << value << " removed from list\n";
            listObject.print();
            break;
        }
    }
    while (choice != 5);
    cout << "End of list test\n\n";
}
void instructions()
{
    cout << "Enter one of the following:\n"
    << " 1 to insert at beginning of list\n"
    << " 2 to insert at end of list\n"
    << " 3 to remove from beginning of list\n"
    << " 4 to remove from end of list\n"
    << " 5 to end list processing\n";
}
...
...
int main() {...}
...
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 risolvere.
Ok. Nessuno ha risposto. Forse non ho saputo chiedere nel modo migliore.
In estrema sintesi:
Perchč puň capitare che una getline() non si blocchi ad aspettare un input
da tastiera?
Nel mio programma la getline() si prende l'output appena mostrato con una
precedente inserzione nel cout.
Ho comunque risolto parzialmente il problema prendendo l'input con una
estrazione da cin.
Spero di essere stato piů chiaro.
Grazie, Fabio.
