scanf Funktion überspringt die Initialisierung der Variable beim 2. Durchlauf



  • Es soll ein Programm sein, welches die Tastatureingaben mitzählt und in einem Array speichert und dann ausgibt wie oft etwas eingegeben wurde. Allerdings beim Ausführen wird einmal nach Zeichen gefragt, danah beim 2. Durchlauf bei scanf wird einfach 10"\n" zum zeichen und der code läuft weiter.
    Danke für eure Hilfe

    #define NO_SECURE_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	char zeichen;											
    	int haeufigkeit[128];
    	
    															
    	for (int i = 0; i < 128; i++) {
    		haeufigkeit[i] = 0;
    	}
    
    	do{
    		printf("Gib etwas ein!\n");
    		scanf("%c", &zeichen);
    		
    		if (zeichen > 31 && zeichen < 128) {
    			haeufigkeit[(int)zeichen]++;
    			
    		}
    		
    		
    	} while ((int)zeichen !=  64);
    	
    	for (int i = 0; i < 128; i++) {
    		printf("%d\n", haeufigkeit[i]);
    	}
    	
    }
    

    Ausgabe:
    Gib etwas ein!
    a
    Gib etwas ein!
    Gib etwas ein!
    b
    Gib etwas ein!
    Gib etwas ein!
    a
    Gib etwas ein!
    Gib etwas ein!
    bb
    Gib etwas ein!
    Gib etwas ein!
    Gib etwas ein!
    aa
    Gib etwas ein!
    Gib etwas ein!
    Gib etwas ein!
    @



  • Das Zeilenendezeichen '\n'steht noch im Eingabepuffer.
    Mittels

    scanf(" %c", &zeichen); // beachte das Leerzeichen am Anfang
    

    kannst du Whitespaces (Leerzeichen, Tab, Zeilenende, ...) überlesen.



  • Schreibe bitte in eine Zeile vor Deinem Code ``` und in eine Zeile nach Deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> in der Symbolleiste über dem Eingabefeld.
    Du kannst Deine Beiträge auch im Nachhinein bearbeiten. Den Menüpunkt "Bearbeiten" findest Du hinter dem Drei-Punkte-Menü rechts unter Deinem Beitrag.
    Danke.


    @furk sagte in scanf Funktion überspringt die Initialisierung der Variable beim 2. Durchlauf:

    haeufigkeit[(int)zeichen]
    

    Darf ich fragen was die Casts - auch an anderer Stelle - bringen sollen?


    @furk sagte in scanf Funktion überspringt die Initialisierung der Variable beim 2. Durchlauf:

    != 64

    Warum schreibst Du nicht '@' hin wenn Du '@' meinst? Vielleicht solltest Du Dir auch mal die Funktionen in <ctype.h> ansehen.



  • @Swordfish in der Aufgabe muss ich nur ASCII Zeichen von 32 bis 127 prüfen wie oft diese eingegeben wurden. Und im Array erhöhe ich dann um 1 wenn beispielsweise 'a' eingegeben wurde dann an Stelle 97 im Array +1



  • @Th69 okay danke dir, ich frag mich aber immer noch wie es dazu kommt, dass wenn ich 2mal ein Zeichen eingebe und dann bestätige die printf anweisung 3 mal ausführt und wenn ich 3mal ein Zeichen eingebe dann wird die printf anweisung 4 mal ausgegeben und immer so weiter...
    Die scnaf Funktion liest irgendwie so oft mein Zeichen nicht ein bis die Schleife einmal mehr durchlaufen ist als ich zeichen eingegeben habe. Dann liest scanf wieder ein.



  • Du liest immer nur genau 1 Zeichen ein, gibst aber in der Schleife jedesmal "Gib etwas ein!\n" aus, so daß dann für jedes Zeichen (inkl. Zeilenendezeichen) dieser Text ausgegeben wird.
    Du solltest die Ausgabe vor die Schleife packen oder eine weitere Schleife um scanfpacken.



  • Du könntest deine Funktion auch so aufbauen:

    initialisiere haeufigkeit;
    while (1 == scanf("%c", &c) && c != '\n') {  
      // solange 1 Zeichen korrekt gelesen wurde und dies kein Enter ist
      if (c == '@') programmende;
      wenn c im interessanten Bereich:
        inkrementiere haeufigkeit für c
    }
    ausgabe haeufigkeiten
    

Log in to reply