Anfängerfrage zur Konsoleneingabe



  • Hey,

    wir haben vo ein paar Tagen in der Schule C++ angefangen und ich hab n paar Probleme mit der Eingabe der Daten in die Konsole. Und zwar arbeitet das Programm manchmal weiter, obwohl ich noch gar nix eingegeben hab. Ich hab ne Suche in nem Array geschrieben, un nach der Suche ne Frage, ob nochmal gesucht werden soll oder nicht. Wenn ich da jetz ein 'j' eingeb überspringt er die neue Suche. Wenn ich gleich Enter mach, dann kann ich die Suche wieder benutzen. Ich denk ma das liegt daran, das ich 2 unterschiedliche Befehle für die Eingabe benutze: fgets und fgetc. Kann ich die Eingabe irgendwie "zurücksetzen"? Vlt liegts ja auch an was anderem, deshalb hier nochma der komplette Code:

    void main(int argc, char* argv[]){
    	char* arr[20];
    	int count = 0;
    	loadArray(arr, &count);
    
    	printf("Anzahl der geladenen Worte: %d", count);
    
    	bool repeat = true;
    	while(repeat){
    		printf("\nBitte geben Sie den Suchberiff ein: ");
    		char input[256];
    		fgets(input, 256, stdin);
    		formatStr(input);
    		bool found = false;
    		for(int i = 0; i < count; i++){
    			if(compStr(input, arr[i])){
    				found = true;
    				printf("Eintrag '%s' an Stelle %d gefunden.", arr[i], i);
    			}
    		}
    		if(!found){
    			printf("Eintrag '%s' nicht gefunden.", input);
    		}
    
    		char answer;
    		printf("\nNeue Suche starten? (j/n) ");
    		answer = fgetc(stdin);
    		if(answer == 'n'){
    			repeat = false;
    		}
    	}
    
    	cin.get();
    }
    

    MfG & Thx Bergmann



  • Warum nutzt du, wenn du C++ programmieren willst, so wenig C++ sondern noch ( zu ) viel C in deinem Quelltext?

    Die Header sind bei solchen Quelltexten dann auch oft interessant.

    MfG f.-th.



  • f.-th. schrieb:

    Warum nutzt du, wenn du C++ programmieren willst, so wenig C++ sondern noch ( zu ) viel C in deinem Quelltext?

    Ich bin nichtmal sicher dass er C++ programmieren will. Ich wüsste von keinem C++-Compiler, der ein "void main" akzeptiert. Das einzige was darauf hinweist ist cin ganz am Ende.
    @OP: "void main" ist grundsätzlich falsch, egal ob C oder C++. es heißt immer "int main"

    ein paar Verbesserungsvorschläge:

    1. das repeat kannst du dir sparen wenn du statt der while-schleife eine do-while-schleife benutzt und "answer != 'n'" als schleifenbedingung wählst.
    2. benutze die iostreams std::cin und std::cout statt printf, fgets, fgetc
    3. benutze std::string statt char-arrays
    4. wenn dir das jetzt alles nichts sagt, lies dich in C++ erstmal gründlich ein udn vergiss vor allem fürs erste all das was du von C her kennst. ich vermute mal dass du ein Umsteiger von C bist


  • Hey,

    das mit dem "int main" wusste ich nich. Das "void main" hab ich irgendwo im Inet gefunden. Was mal wieder ein Beweiß dafür ist, das man nich alles glauben soll was da steht^^

    Zu deinen Vorschlägen:
    1.: erledigt
    2.: cin hab ich geändert, das printf hab ich behalten, weil ich die Ausgabe damit gut formatieren kann, oder spricht was gegen die Benutzung von printf?
    3.: wir sollen es erstmal klassisch mit char-Arrays machen un das ganze danach auf CString umbauen
    4.: wir haben ganz neu mit C/C++ angefangen. Davor hatten wir Java und ich kenn mich eig eher mit Pascal aus. Gibts irgendwelche empfehlenswerte Lektüre dazu? So ne Art Crash-Kurs?

    MfG & Thx Bergmann.


  • Administrator

    Bergmann89 schrieb:

    2.: cin hab ich geändert, das printf hab ich behalten, weil ich die Ausgabe damit gut formatieren kann, oder spricht was gegen die Benutzung von printf?

    Alles was printf in Sachen Formatierung kann, können auch die IO-Streams. printf ist sehr gefährlich, wegen der fehlenden Typsichereit und man somit sehr schnell in undefiniertes Verhalten reinrennen kann.

    Bergmann89 schrieb:

    3.: wir sollen es erstmal klassisch mit char-Arrays machen un das ganze danach auf CString umbauen
    4.: wir haben ganz neu mit C/C++ angefangen. Davor hatten wir Java und ich kenn mich eig eher mit Pascal aus.

    Oje. Klingt mal wieder nach super C++ Professoren wenig Ahnung von modernem C++. Wenn man nur schon so Dinge wie C/C++ liest. Oder zuerst char-Arrays lernen ... auf CString umbauen? Meinst du C-String oder CString? Falls es CString ist, dann erst recht: oje.

    Bergmann89 schrieb:

    Gibts irgendwelche empfehlenswerte Lektüre dazu? So ne Art Crash-Kurs?

    Mit einem Crash-Kurs kannst du nicht C++ lernen mit Büchern dagegen schon:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-251551.html

    Grüssli



  • Bergmann89 schrieb:

    3.: wir sollen es erstmal klassisch mit char-Arrays machen un das ganze danach auf CString umbauen

    Arghh... Also einen Sprung von C auf MFC + ein wenig C++...

    Bergmann89 schrieb:

    4.: wir haben ganz neu mit C/C++ angefangen.

    Bitte nenne C und C++ nie direkt in Kombination... Es gibt kein C/C++, und auch wenn C++ zum Teil abwärtskompatibel ist, wird es eigentlich anders programmiert.

    Bergmann89 schrieb:

    Gibts irgendwelche empfehlenswerte Lektüre dazu? So ne Art Crash-Kurs?

    Crash-Kurse bringen niemals wirklich etwas. Als Lektüre sei hier einmal "Thinking in C++" und der "C++ Primer" genannt, ersteres gibt es kostenlos im Internet (die Seite des Autors ist nur gerade nicht erreichbar, daher ohne Linkangabe).



  • Bergmann89 schrieb:

    2.: cin hab ich geändert, das printf hab ich behalten, weil ich die Ausgabe damit gut formatieren kann, oder spricht was gegen die Benutzung von printf?

    Vieles. Es ist nicht typsicher, du kannst keine Klassen ausgeben, du kannst Tippfehler bei den Formatangaben leicht übersehn und nurnoch Murks rausbekommen. Die kürzere Schreibweise bei der Formatierung ist der einzige Vorteil gegenüber cout.

    3.: wir sollen es erstmal klassisch mit char-Arrays machen un das ganze danach auf CString umbauen

    Wer ist "wir" - und vor allem wer sagt euch das? Ein Prof/Lehrer? Mindestens jenseits der 50, eher noch jenseits der 60, vor allem aber leicht angestaubt, konservativ und resistent gegen Neuerungen? In C++ "Klassisch mit char-Arrays anfangen" ist so ähnlich wie beim Telefonieren erstmal klassisch mit Morsen anfangen... (okay, vielleicht nicht ganz so extrem) Es gibt für Anfänger keinen Grund, die in vielerlei Hinsicht sichereren std::strings nicht zu nutzen. Später sollte man sicher auch den Umgang mit char-Arrays lernen, wenns an die Sprachdetails geht, aber eben erst später. CString ist afaik eine Klasse der MFC und nicht aus dem C++-Standard. Der bietet auch eine String-Klasse, nämlich std::string.

    4.: wir haben ganz neu mit C/C++ angefangen.

    C/C++ ist keine Sprache. C ist eine Sprache, C++ eine andere. Sie haben viele Gemeinsamkeiten, aber auch deutliche Uterschiede. C++ ist aus C entstanden, daher die Gemeinsamkeiten, und in den 90ern und Anfang der 2000er wurde noch recht viel gemischt. Inzwischen kommt man immer mehr davon weg, vermutlich weil die Dinosaurier, die C++ als "C mit Klassen" sehen und programmieren, allmählich aussterben. Zur Erklärung: Aus Kompatibilitätsgründen funktionieren ca. 98% der Dinge aus C auch jetzt noch in C++, so dass C- und C++-Code ohne Probleme gemischt werden können. Tatsächlich gehören aber nur geschätzte 15% des C-Standards auch wirklich zu C++, für den Rest gibts in C++ Alternativen, die meistens besser sind und eigentlich immer mehr der Sprachphilosophie von C++ entsprechen. Die unterscheidet sich von C nämlich stark.

    Gibts irgendwelche empfehlenswerte Lektüre dazu? So ne Art Crash-Kurs?

    Viele der neueren C++-Bücher. In der FAQ gibts eine ganze Liste, das eine oder andere frei erhältliche PDF-Buch ist auch dabei.



  • Hey,

    danke für die zahlreichen Antworten. Was das mit den char-Arrays soll hab ich mich auch gefragt, aber wenn man da was sagt is man eh wieder der Blöde, also mach ichs einfach.
    Ob wir (meine Mitstudenten und ich) dann im 2. Teil der aufgabe C-Strings, CStrings oder Strings verwenden sollen weiß ich nich. Muss ich auch nochmal fragen. Aber in der Aufgabestellung steht CString.
    Lektüre hab ich auch schon gute gefunden und bei kongreten Fragen kann ich ja auch hier nochmal ein Topic auf machen 🙂

    MfG & Thx Bergmann.



  • Ein bisschen formatieren mit C++
    http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/c++_zahlenformatierung_de

    Ist das MSDN inzwischen von

    void main()
    

    befreit oder sind da immer noch einige, aber nicht alle Beispiele in der Form enthalten.

    MfG f.-th.


Log in to reply