Mehrere scanf - Überschreibung?



  • Hallo Leute,

    ich habe in meiner main-funktion ein scanf mit dem ich ein array von char's einlese, dannach kommt ein weiteres scanf mit dem ich ein int einlese.
    So weit gibts auch keine Probleme.
    Weiter in einer if Anweisung, benutze ich ein weiteres scanf, um ein char-array wieder einzulesen, jedoch wird mein erstes char array überschrieben sobald ich was einlese.

    Sieht so aus als würde scanf den gleichen speicherplatz benutzen!?!?!?
    Wie kann ich das umgehen?

    Danke im voraus.



  • Code posten.



  • Ich spare euch mal die Funktionen, die laufen ja ganz gut.

    int main()
    {
    
    	char eingabe[1000];
    	char suche[10];
    	int option;
    
    	printf("Geben Sie, eine Liste ein:");
    	scanf("%[^'\n']",eingabe);
    	printf("Welche Option? (1=liste löschen,2=liste umkehren,3=nach Übereinstimmung suchen)");
    	scanf("%d",&option);
    
    		if (option==1){
    			printf("blabla");
    		}
    		else if (option==2){
    			printf("blabla");
    		}
    		else if (option==3){
    			printf("Nach welchem Element möchten Sie suchen?");
    			scanf("%[^'\n']",suche);
    			printf("blabla");
    		}
    		else{
    			printf("falsche Eingabe\n");
    		}
    
    	return 0;
    }
    

    Das "suche" muss eigentlich kein array seien, aber irgendwie wurde als char eine Zahl ausgegeben als ich es mit printf checken wollte was drin steht.
    Also bei option==3 ist das Problem, scanf klappt dort irgendwie nicht.



  • Prüfst du den Quelltext mit einem Debugger?

    Oder wie äussert sich dein, klappt nicht?

    Hab da so eine Ahnung, was falsch geht. Aber eine vernünftige Fehlerbeschreibung ist schon nicht schlecht.

    Wenn meine Ahnung richtig ist, gibt es zig Beiträge dazu allein hier im Forum auch mit Lösungen. Die eine oft beschriebene Lösung soll nach der reinen C-Lehre nicht zuverlässig funktionieren. Also, wenn die bei euch funktioniert muss die aber nicht bei eurem Kumpel oder an der Schule funktionieren, oder umgekehrt.

    Und kannst du mit dieser Umschreibung etwas anfangen 😕 😃
    Ist so etwa wie deine Fehlerbeschreibung 🤡

    MfG f.-th.



  • nimm mal den oberen scanf für die Zahl raus...
    Da bestätigst Du mit Enter, also hast Du ein newline im Puffer. Dann kommt das scanf und nimmt sich alles bis zum newline im Puffer - nämlich nichts 🙂

    int c; // int c, nicht char c.
    while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt so
    

    die while-Zeile nach einem scanf, das keine newlines verwirft und gegebenenfalls vorhandene Inhalte im Puffer werden verschluckt.



  • jetzt hab ich f.-th. den Spaß verdorben 😉

    Worauf er möglicherweise hinauswollte:

    Du hast wie erwähnt von der Zahleneingabe noch ein newline im Puffer, das rausmuss, bevor Du das nächste scanf aufrufst.

    Wer einen schmuddeligen Microsoft-Compiler (verwenden muss) verwendet, kann sich womöglich mit einem nicht-standard-c-"fflush (stdin);" behelfen.
    Unter Linux hat das keinesfalls den gewünschten Effekt. Deshalb ist nur zu empfehlen, sich sowas gar nicht erst anzugewöhnen, sondern "flexibel" zu bleiben und sein Verständnis für die Sprache mit einer einfachen Zeile zu signalisieren 😉

    Wer's besonders chic möchte, soll sich halt das Schnipselchen in eine Funktion packen, praktischerweise mit Zähler und Rückgabe der verworfenen Zeichen.



  • Probier mal

    scanf(" %[^\n]",suche); 
    //     ^ Da ist ein Leerzeichen
    

    Das Leerzeichen am Anfang überliest die Whitespaces (das \n von der Zahleneingabe) und zumindest ein ' ist zuviel (eher beide).



  • Dabei muss man halt bedenken, dass etwaige erwünschte Leerzeichen am Anfang der Benutzereingabe getrimmt werden (mag eher selten zu Problemen führen, hat es aber bei mir mal).
    Die Anführungszeichen aber stören eigentlich nicht und sorgen für meine Augen für etwas Übersicht.



  • würmchen schrieb:

    Die Anführungszeichen aber stören eigentlich nicht und sorgen für meine Augen für etwas Übersicht.

    Das [^'\n'] bedeutet "Alle Zeichen ausser \n und '.". Also führt ein ' genau so zum beenden des einlesens wie \n. Und es reicht, das Zeichen einmal in der Liste zu nennen.



  • right DirkB, ich war grade auf irgendnem anderen Kreuzfahrtschiff unterwegs, glaube ich 🙂



  • Ich hab sowas geahnt und hatte versucht den Tastaturpuffer zu leeren, erfolglos.
    Ich wusste nicht dass das in Linux problematisch ist.
    Naja jetzt funktioniert es mit dem Leerzeichen vor dem scan, danke. 😉



  • Das hat nichts mit Linux zu tun, sondern mit dem Compiler.


Anmelden zum Antworten