Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

Ο παρακάτω κώδικας μας ζητάει να διαλέξουμε μεταξύ 3 επιλογών. Αν δώσουμε 1 εκτελείται μέσω της switch η συνάρτηση func1(), αν δώσουμε 2 εκτελείται η συνάρτηση func2() και αν δώσουμε 3 το πρόγραμμα τερματίζει.

Και οι 2 συναρτήσεις func1() και func2() μας ζητάνε να εισάγουμε ένα αλφαριθμητικό που στη συνέχεια μας το προβάλλουν στην κονσόλα.

Το πρόβλημα είναι ότι για να λειτουργήσει σωστά η func1() πρέπει να χρησιμοποιηθεί η getchar() μέσα στη func1(). Μετά η getline() που χρησιμοποιείται θα περιμένει για είσοδο. Όμως μου φαίνεται πρόχειρος  αυτός ο τρόπος, η χρήση δηλαδή της gechar().

Η δε func2() δεν λειτουργεί. Δείτε ότι δεν χρησιμοποιείται η getchar() αλλά μόνο η getline(). Δεν περιμένει όμως για είσοδο.

Το ερώτημα είναι αν υπάρχει κάποιος πιο σωστός τρόπος στη C++ για την είσοδο, χωρίς δηλαδή τη χρήση της getchar().

Ευχαριστώ!

// example.cpp

#include <iostream>
#include <string>
#include <cstdio>

using namespace std;

void func1(void);
void func2(void);

int main(void)
{
    int selection = 0;

    while (1) {
        cout << "Select an option:" << endl;
        cout << "\t1. Call func1()" << endl;
        cout << "\t2. Call func2()" << endl;
        cout << "\t3. Exit" << endl;

        cin >> selection;

        switch (selection) {
        case 1:
            func1();
            break;
        case 2:
            func2();
            break;
        case 3:
            exit(0);
            // break;
        default:
            cout << "Invalid option!" << endl;
            break;
        }
    }
    return 0;
}

void func1(void)
{
    string textline;
    char c;

    c = getchar();
    cout << "func1()" << endl;
    cout << "Enter some text: " << endl;
    getline(cin, textline);
    cout << textline << endl;
}

void func2(void)
{
    string textline;

    cout << "func2()" << endl;
    cout << "Enter some text: " << endl;
    getline(cin, textline);
    cout << textline << endl;
}

 

  • Moderators
Δημοσ.

Ρίξε μια ματιά εδώ.

Αναφορά σε κείμενο

When consuming whitespace-delimited input (e.g. int n; std::cin >> n;) any whitespace that follows, including a newline character, will be left on the input stream. Then when switching to line-oriented input, the first line retrieved with getline will be just that whitespace. In the likely case that this is unwanted behaviour, possible solutions include:

  • An explicit extraneous initial call to getline.
  • Removing consecutive whitespace with std::cin >> std::ws.
  • Ignoring all leftover characters on the line of input with cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');.

 

  • Like 1
  • Λύση
Δημοσ.

Νομίζω το πρόβλημα έχει να κάνει με τον τρόπο που λειτουργεί το cin στη C++... Μετά την πρώτη επιλογή (1, 2 ή 3) πατώντας enter, μετά τον χαρακτήρα εισάγεται ένα newline character ("\n") (με μια επιφυλαξη - δεν είμαι 100% σίγουρος). Στην περίπτωση του func1 ο,τι χαρακτήρας υπάρχει στο cin και περιμένει "τρώγεται" από το getchar(), στο func2 όμως όχι. 

Μπορείς να χρησιμοποιήσεις το "cin.ignore()" για να πετάξεις ότι έχει αποθηκευτεί εκεί μέσα και δεν το χρειάζεσαι, πριν προχωρήσεις στην αποθήκευση καινούριων δεδομένων στο cin.  

void func1(void)
{
    string textline;
    char c;

    //c = getchar();
    cout << "func1()" << endl;
    cout << "Enter some text: " << endl;
    
    cin.ignore();
    
    getline(cin, textline);
    cout << textline << endl;
}

void func2(void)
{
    string textline;

    cout << "func2()" << endl;
    cout << "Enter some text: " << endl;
    
    cin.ignore();
    
    getline(cin, textline);
    cout << textline << endl;
}

 

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...