Array fehler



  • #include <stdio.h>
    
    int stringFkt(char string[], char* min, char* max)
    {
        int i;
        int temp;
        int length=0;
    
    //Längenberechnung
        for(i=0; i<20; i++){
        if(string[i]>=32 && string[i]<=126)
            length++;
        }
    
    //Ermittlung des größten Wertes
        for(i=0; i<length; i++){
            if(string[0] < string[i]){
                temp = string[0];
                string[0] = string[i];
                string[i] = temp;
            }
        }
    
        *max = string[0];
    
    //Ermittlung des kleinsten Wertes
        for(i=0; i<length; i++){
            if(string[0] > string[i]){
                temp = string[i];
                string[0] = string[i];
                string[i] = temp;
            }
        }
    
        *min = string[0];
    
        return sizeof(char)*length; //universell wenn char sich unterscheidet
                                    //Bei dem getesteten pc/laptop entspricht 1 char = 1byte
    }
    
    int main(void){
    
        char string[21];
        char minChar = 0;
        char maxChar = 0;
    
        int exit = 0;
    
        int length;
    
        while(!exit){
            printf("Bitte Test-String eingeben: ");
            fgets(string, 20, stdin); 
    
            if(string[0] == 'q')
                exit = 1;
    
            length = stringFkt(string, &minChar, &maxChar);
           //length wird nicht auf 0 gesetzt        
            printf("length = %d, minChar = %c, maxChar = %c\n\n", length, minChar, maxChar);
        }
        return 0;
    }
    

    Wenn ich nun z.b. ein Wort mit 9 buchstaben eingebe und danach eins mit drei, dann stimmt nicht mehr die ausgabe, kann mir jemand sagen wo der fehler ist ?



  • Spontan würde ich darauf tippen, dass mit der "Längenberechnung" zu tun hat. Warum nicht einfach strlen()?

    PS: sizeof(char) ist immer 1

    PPS: der 2. Parameter von fgets() sollte genau so groß sein wie dein buffer. fgets() rechnet die '\0' schon mit.

    edit: In Zukunft bitte die [cpp]-Tags statt den [code]-Tags verwenden. Danke.



  • ok, danke es geht nun, aber es kommt noch eine falsche eingabe bei einem overflow also wenn die eingabe über die 20 geht, was könnte man dagegen tun ?

    while(getchar() != '\n');

    damit würde es gehen (linux) aber ich müsste bei keinem overflow einmal was eingeben, wie könnte man dies umgehen ?



  • Wenn im Eingabepuffer mehr als deine 20 Zeichen stehen, bleibt der Rest zurück und wird beim nächsten Einlese-Versuch abgeholt. Deine while()-Schleife (die übrigens überall funktioniert) löscht einfach den Rest der Eingabezeile bis zum ENTER). Wenn du diese Eingaben noch mit verarbeiten willst, mußt du ein größeres Array verwenden (oder dein Array dynamisch anlegen (malloc(), realloc(), free()).

    PS: Dir ist doch hoffentlich klar, daß es elegantere MEthoden gibt, das Minumum und Maximum einer Zeichenkette zu finden?



  • TactX schrieb:

    edit: In Zukunft bitte die [cpp]-Tags statt den [code]-Tags verwenden. Danke.

    lieber nicht. da erscheint 'new' als keyword 😉



  • Immernoch besser als gar kein Highlighting.



  • ja ich meinte damit dass ich mit linux programmiere und "fflush(stdin)" nicht benutzen kann.

    wenn ich nun die while schleife benutze dann muss ich nach meiner eingabe nochmal die eingabetaste drücken, kann man dies umgehen ? bzw. gibts eine andere funktion ?

    meine zweite frage wäre welche funktion ihr damit meint um den max und min wert zu erfassen !?



  • sigum schrieb:

    ja ich meinte damit dass ich mit linux programmiere und "fflush(stdin)" nicht benutzen kann.

    wenn ich nun die while schleife benutze dann muss ich nach meiner eingabe nochmal die eingabetaste drücken, kann man dies umgehen ? bzw. gibts eine andere funktion ?

    Ja, fflush(stdin) ist MS-Müll. Und eigentlich sollte die obige while()-Schleife auch funktionieren.

    meine zweite frage wäre welche funktion ihr damit meint um den max und min wert zu erfassen !?

    Einfach in einer Schleife über den String laufen und jeweils das aktuelle Maximum und Minimum mitschreiben:

    int stringFkt(char string[], char* min, char* max)
    {
      int len = strlen(string), i;
      *max=*min=string[0];
      for(i=1;i<len;++i)
      {
        if(string[i]<*min) *min = string[i];
        if(string[i]>*max) *max = string[i];
      }
      return len;
    }
    


  • Array fehler schrieb:

    while(!exit){
            printf("Bitte Test-String eingeben: ");
            fgets(string, 20, stdin); 
    
            if(string[0] == 'q')
                exit = 1;
    

    Ich hab da mal 'ne Frage.
    Was machst Du eigentlich, wenn jemand ein Wort eingibt, dass mit einem kleinem
    'q' anfängt? 😉



  • #include <stdio.h>
    #include <string.h>
    
    int stringFkt(char string[], char* min, char* max)
    {
        int i;
        int len = strlen(string);
    
        if(len < 30) 
             len--;  // 0byte wird zum schluß eingelesen, wenn array nicht voll ist
                     // wird len 1 mehr ausgeben als es ist*/
    
        *max=*min=string[0];
    
        for(i=1;i<len;++i){
    
            if(string[i]<*min) 
                *min = string[i];
    
            if(string[i]>*max) 
                *max = string[i];
        }
    
      return len;
    }
    
    int main(void){
    
        char string[32];
        char minChar = 0;
        char maxChar = 0;
    
        int exit = 0;
        int length;
    
        while(!exit){
            printf("Bitte Test-String eingeben (30 - Zeichen): ");
            fgets(string, 32, stdin); 
    
            if(string[0] == 'q')
                exit = 1;
    
            length = stringFkt(string, &minChar, &maxChar);
    
            if(length>=30) {
            length--;                           // 32 eingaben möglich -> string[31] -> (-31) weil 31 == 0
            while(getchar() != '\n');
            }
    
            printf("length = %d, minChar = %c, maxChar = %c\n\n", length, minChar, maxChar);
        }
        return 0;
    }
    

    Das Programm funktioniert aber wenn ich genau 30 eingebe muss ich 2mal enter klicken, die frage nun: wieso ?



  • sigum schrieb:

    if(length>=30) {
            length--;                           // 32 eingaben möglich -> string[31] -> (-31) weil 31 == 0
            while(getchar() != '\n');
            }
    

    Was soll hier erreicht werden? fgets() liest eh nur soviel ein wie im buffer Platz ist.



  • wenn du nun z.b. 40 werte eingibst macht es was du willst aber durch die schleife läuft die schleife nochmal von selbst durch und nimmt die werde die über den buffer hinauslaufen

    ps. weiß jemand warum es mit 30 nicht geht ?


Anmelden zum Antworten