Probleme mit char, cout und cin (einfacher Code)



  • Hey Leute,
    ich hab grad erst angefangen programmieren zu lernen und versuche mich jetzt seit 20 Minuten an einem eigenen kleinen Code.
    Bis zu Zeile 18 oder 19 funktioniert soweit auch noch alles. Wenn ich dann im Programm einen Namen eingebe und Enter drücke, schließt sich die Box einfach. Habt ihr eine Idee woran es liegt und was ich besser machen kann?

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	int age;
             cout << "Please insert your age: " << endl;
    	cin >> age;
             getchar();
    
    	if (age < 18 )
    		cout << "Acces denied! " << endl;
    		getchar();
    
    	if (age >= 18)
    	{
    		char name;
    		cout << "Please insert your full name: " << endl;
    		cin >> name;
    
    		cout << "Good morning, " << name << endl;
    		getchar();
    
    	}
    
    	return 0;
    }
    


  • char ist der Datentyp für EIN Zeichen. Ein Name besteht aus vielen Zeichen, da wäre der Datentyp std::string angebracht.



  • Ah stimmt 🙂
    okay, wie schreibe ich das dann? Einfach string name; oder wie? Muss ich dann oben noch eine Library inkludieren?



  • Du musst noch einen Header inkludieren und zwar string.



  • Ich hab jetzt oben #include<string> und unten string name; hingeschrieben.
    Funktioniert immer noch nicht. Weitere Ideen? 🙂



  • Die Mischung von getchar() und std::cin ist übrigens ein wenig blöd, nutze lieber cin.get(), das macht das Gleiche.
    Der Grund, warum das bei dir nicht klappt, ist folgender:
    cin >> name; liest solange Zeichen ein, bis ein Zeichen kommt, dass - warum auch immer - nicht konvertierbar ist oder ein Whitespace (' ', '\t', '\n'). In deinem Fall ist das ein '\n', weil der User die Eingabe mit Enter abgeschlossen hat. getchar()/cin.get() liest nun das nächste Zeichen vom Eingabepuffer - das '\n'. Merkste was?
    Du musst den Puffer erst leeren. Das geht mit.
    cin.ignore(std::numeric_limitsstd::streamsize::max());
    Das leert solange den Puffer, bis max() Zeichen eingelesen wurden (das Maximum, was möglich ist). Du musst noch limits includiren, wegen numeric_limits.



  • Ich würde getline(std::cin, string); benutzen.



  • Okay, das versuch ich gleich mal, wenn ich nach 10mal lesen hoffentlich alles verstanden hab 😉 Als ich oben gesagt hab, dass ich Anfänger bin, meinte ich damit, dass ich vor 2 Tagen angefangen hab. Also weiß ich praktisch noch nichts 😛
    Da ich zu Beginn using namespace std; verwendet hab, kann ich das std:: vorher dann weglassen oder?



  • Serena schrieb:

    da ich zu beginn using namespace std; verwendet hab, kann ich das std:: vorher dann weglassen oder?

    jopp.
    einfach nur

    string str;
    getline(cin, str);
    

    btw: Besorg dir ein Buch dann kommst du schneller vorran 😉



  • Danke! Mal sehn, obs klappt! 🙂
    Buch ist schon bestellt und morgen da! Ich konnte es nur nicht erwarten anzufangen 😃



  • Serena schrieb:

    Wenn ich dann im Programm einen Namen eingebe und Enter drücke, schließt sich die Box einfach.

    Starte Dein Programm aus einer Konsole, dann schließt diese sich auch nicht, wenn Dein Programm zu Ende ist.



  • Es funktioniert alles nicht. Was mach ich bloß falsch? 😮



  • Serena schrieb:

    Es funktioniert alles nicht. Was mach ich bloß falsch? 😮

    Ich bin mal so nett und bitte dich darum den Code zu posten.



  • Und "es funktioniert nicht" war noch nie eine hilfreiche Fehlerbeschreibung 😉

    Hier mal ein Minimalbeispiel:

    #include <iostream>
    #include <string>
    
    int main(){
        std::string str;
        getline(std::cin, str);
        std::cout << str;
        return 0;
    }
    

    Kompilierts?



  • #include<iostream> 
    #include<string>
    #include<limits>
    using namespace std; 
    
    int main() 
    { 
        int age; 
             cout << "Please insert your age: " << endl; 
        cin >> age;
             getchar(); 
    
        if (age < 18 ) 
            cout << "Acces denied! " << endl; 
            getchar(); 
    
        if (age >= 18) 
        { 
            string name; 
            cout << "Please insert your full name: " << endl; 
            cin >> name;
    		cin.ignore(numeric_limits<streamsize>::max());
    		cin.get();
    
            cout << "Good morning, " << name << endl; 
            cin.get(); 
    
        } 
    
        return 0; 
    }
    

    ich hab jetzt garkeinen Durchblick mehr ... 😛



  • C++ lernen erst vor 2 Tagen begonnen?

    Ich würd das mit dem cin.ignore()/get() für den Anfang mal komplett sein lassen.
    Ich rate Dir an für heute getline() zu benutzen, und bis morgen (bis dein Buch ankommt ;)) warten. Dann hast du nämlich ein strukturiertes Werk vor Dir, wobei alles genauer beschrieben wird, und Du Dich nicht quer durch C++ schlagen musst, sodass Du später noch mehr Fragen hast, als Du sie vorher schon hattest.

    Meine persönliche Meinung dazu.
    Aber mach wie's Dir passt 😛



  • Ja, vor 2 Tagen. Erst aus Langeweile heraus und dann festgestellt, wie interessant das ist 😉

    Ich glaube, ich warte jetzt wirklich bis morgen und fang dann nochmal ganz von Anfang an!
    Aber danke für deine und eure Hilfe! 🙂



  • Hier mal korrigiert.

    int main()
    {
        int age;
        cout << "Please insert your age: " << endl;
        cin >> age; // getchar() weg, Enter muss man so oder so eingeben
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // hier puffer leeren, sorry habe das '\n' vergessen; alles bis zum ersten '\n' löschen
    
        if (age < 18 )
        {
            cout << "Acces denied! " << endl;   // getchar() weg
        }
        else // heißt ansonsten, wenn alter nicht kleiner 18
        {
            string name;
            cout << "Please insert your full name: " << endl;
    
            getline(cin, name); //getline anstatt cin >> name; Das liest mehrere Strings ein
            // cin.get() weg
            cout << "Good morning, " << name << endl;
        }
    
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // hier ebenfalls Puffer leeren
        cin.get(); //einmal zum Abschluss auf eine Eingabe warten
    }
    


  • Es hat endlich funktioniert! Ich werd mich da jetzt nochmal durcharbeiten.
    Vielen lieben Dank, Nathan!! 🙂



  • Ach ja, die Freude bei solch simplen Programmen...
    Wie stolz ich bei meinem Programm war, dass ausgabe ob man Kind, Erwachsener oder Jugendlicher ist... 😃



  • Nathan schrieb:

    [...]
    getline(cin, name); //getline anstatt cin >> name; Das liest mehrere Strings ein

    [...]

    Wieviel denn so im Durchschnitt? Und ... wo werden die dann abgespeichert?
    Und ... gibt das nachfolgende

    cout << name;
    

    dann auch mehrere Strings aus?


Anmelden zum Antworten