C funktionalität



  • Ich habe ein etwas umfangreicheres Programm geschrieben.
    In diesem werden Strings mittels der Funktion read_char in die Felder einer Struktur eingelesen.
    Ein Kumpel von mir hat sich meinen Code mal angesehen und meinte das man die Funktion auch kürzer schreiben kann. jedoch bleibt seine Schleife hängen.
    mich interessiert jetzt nur warum.
    eigentlich müsste sein Code auch funktionieren
    Schreibt man seinen Code etwas um funktioniert das ganze wieder Siehe Beispiel 3
    scheinbar ligt das ganze an der zusätzlichen verwendung der Variablen "stop"
    (natürlich kommentiere ich die Funktionen so aus das immer nur eine Verwendet wird)
    Der code funktioniert so das so lange zeichen in char_arr eingeleden werden bis das new line erreicht wird, dieses wird dann duch eine binäre null ersetzt damit der String korrekt abgeschlossen wird.
    Funktioniert

    int read_char(char *ch_arr){
        int stop, lastchar;
        lastchar = 0;
        stop = 0;
        while(stop != 1){
            ch_arr[lastchar] = getchar();
            if(ch_arr[lastchar] == '\n'){
                stop = 1;
                ch_arr[lastchar] = '\0';
            }
            else
                lastchar = lastchar + 1;
            if(lastchar == ARSIZE)//
                stop = 1;
                ch_arr[lastchar] = '\0';
        }
    }
    

    Vom Kumpel

    int read_char(char *ch_arr){
        for(int i=0; ch_arr[i] != '\n'; i++) ch_arr[i] = getchar();
        ch_arr[i] = '\0';
    }
    

    Vom Kumpel, Angepasst und Funktioniert

    int read_char(char *ch_arr){
        int i=0, stop=0;
        for(i=0; stop == 1; i++){
            ch_arr[i] = getchar();
            printf(" %i",ch_arr[i]);
            if (ch_arr[i]== '\n'){
                stop=1;
            }
        }
        ch_arr[i] = '\0';
        }
    }
    


  • Ich schreibe die Funktion von deiem Kumpel mal mit while-Schleife
    (Da gibt es funktional gar keinen Unterschied)

    int read_char(char *ch_arr){
    
        int i=0; 
        while(ch_arr[i] != '\n') 
        { ch_arr[i] = getchar();
          i++;
        }
        ch_arr[i] = '\0';
    }
    

    Und dann kannst du 2 Probleme sehen:
    i = 0
    1. Durchlauf
    Test ch_arr[0] != '\n' obwohl da noch kein Zeichen eingelesen wurde.
    Zuweisung ch_arr[0] = getchar();
    i++ -> i ist jetzt 1
    2. Durchlauf
    Test ch_arr[1] != '\n' obwohl da noch kein Zeichen eingelesen wurde.
    .....



  • hmm

    ich glaub ich hab's verstanden
    Der Test ob ch_arr ein new line (\n) enthält findet vor der Zuweisung durch getchar() statt
    danach wird i erhöht
    würde jetzt ein new line zugewiesen werden, würde danach i erhöht und beim nächsten test ist ch_arr[i] wieder nicht gleich '\n'
    ich brauche also die variable stop um mir den zustand zu merken das da ein new line zugewiesen wurde.



  • Oder alles zusammen

    int read_char(char *ch_arr){
    
        int i=0;
        int c;
        while((c = getchar()) != '\n' && c != EOF) // Zuweisung und danach Vergleich. 
          ch_arr[i++] = c;  
        ch_arr[i] = '\0';
    }
    

    Wenn du schon eine eigene Funktion schreibst, dann mach eine, die auch eine Längenüberprüfung macht.

    int read_char(char *ch_arr, size_t max_len);
    

Anmelden zum Antworten