Mehrere scanf - Überschreibung?



  • 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