Anfänger Frage



  • Hallo,
    Ich habe das folgende C Programm: Man gibt eine Zahl ein, danach die entsprechende Anzahl von Wörtern. Diese Wörter werden dann alphabetisch sortiert ausgegeben.
    Wie kann ich das Programm nun ändern, damit ich am Anfang nicht die Anzahl der Wörter eingeben muss, die sortiert werden sollen, sondern direkt eine Liste von Wörtern einsetzen kann, die dann gleich sortiert ausgegeben wird?
    Hier ist der Code, bin für jede Hilfe dankbar 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    
    int cstring_cmp(const void *a, const void *b)
    {
        const char **ia = (const char **)a;
        const char **ib = (const char **)b;
        return strcasecmp(*ia, *ib);
    }
    
    int main (int argc, char *argv [])
    
    {
        int number;
        char temp [5000];
    
        printf("input number: ");
        scanf("%d",&number);
    
        char* array_string [number];
        int i;
        for (i=0;i<number;i++) {
            scanf(" %[^\n]", temp);
            array_string [i] = (char*)malloc((strlen(temp)+1)*sizeof(char));
            strcpy(array_string[i], temp);
        }
    
        size_t large = sizeof(array_string) / sizeof(char *);
        qsort(array_string,large ,sizeof(char *) ,cstring_cmp );
        printf ("\n");
        printf ("the sorted array list is:\n");
        for (i=0;i<large;i++)
            printf("%s\n", array_string [i]);
        return 0;
    }
    


  • supermex schrieb:

    Hallo,
    Ich habe das folgende C Programm: Man gibt eine Zahl ein, danach die entsprechende Anzahl von Wörtern. Diese Wörter werden dann alphabetisch sortiert ausgegeben.
    Wie kann ich das Programm nun ändern, damit ich am Anfang nicht die Anzahl der Wörter eingeben muss, die sortiert werden sollen, sondern direkt eine Liste von Wörtern einsetzen kann, die dann gleich sortiert ausgegeben wird?
    Hier ist der Code, bin für jede Hilfe dankbar 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    
    int cstring_cmp(const void *a, const void *b)
    {
        const char **ia = (const char **)a;
        const char **ib = (const char **)b;
        return strcasecmp(*ia, *ib);
    }
    
    int main (int argc, char *argv [])
    
    {
        int number;
        char temp [5000];
        
        printf("input number: ");
        scanf("%d",&number);
        
        char* array_string [number];
        int i;
        for (i=0;i<number;i++) {
            scanf(" %[^\n]", temp);
            array_string [i] = (char*)malloc((strlen(temp)+1)*sizeof(char));   // <-- warum nicht strdup?
            strcpy(array_string[i], temp);                                     // <-- dann brauchst Du das nicht
        }
        
        
        size_t large = sizeof(array_string) / sizeof(char *);                 // <-- warum nicht number?
        qsort(array_string,large ,sizeof(char *) ,cstring_cmp );
        printf ("\n");
        printf ("the sorted array list is:\n");
        for (i=0;i<large;i++)
            printf("%s\n", array_string [i]);
        return 0;
    }
    

    Zu Deinem Problem:
    Alloziere array_string dynamisch auf dem Heap (Tip: realloc) und vergrößere es bei Bedarf.

    VG Martin



  • Das mit "Realloc" hab ich mir schon gedacht, nur weiß ich leider überhaupt nicht wie ich es implementieren soll.



  • Zuerst mal kannst du aufhören, Wörter zu verwenden, von denen du nicht weißt, was sie bedeuten. "Implementieren" sollst du realloc nicht, du solltst es verwenden.

    Und dein Einwand ist so dermaßen an Faulheit nicht zu übertreifen, dass mir mein Energydrink wieder hochkommt. Wie gottverdammt schwer ist es denn, c realloc usage zu googlen? Nein, das hat nichts mit Anfängertum zu tun, du bist einfach faul und erwartest, dass man dir eine Lösung auf dem Silbertablett bringt.

    Woran ich das erkenne? Nun, wenn du ernsthaft daran interessiert gewesen wärst, hättest du zumindest einen (kaputten) Codeausschnitt gepastet, in dem man dich realloc falsch verwenden sieht - aber man würde zumindest sehen, dass du versucht hast, da durchzusteigen. Ich würde das mit dem Programmieren lassen. To be proactive is part of the fucking job.



  • mach nicht für jeden Furz ein neues Thema auf! Das nervt! Wirklich zu blöd um google zu benutzen?!
    Wie dachschaden schon sagt: Lass es mit dem programmieren!



  • supermex schrieb:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h> /* kein Standard */
    #include <stdio.h>
    #include <string.h>
    
    int cstring_cmp(const void *a, const void *b)
    {
        const char **ia = (const char **)a;
        const char **ib = (const char **)b;
        return strcasecmp(*ia, *ib); /* kein Standard, besser strcmp */
    }
    
    int main (int argc, char *argv [])
    
    {
        int number;
        char temp [5000];
        
        printf("input number: ");
        scanf("%d",&number);
        
        char* array_string [number]; /* VLA benutzen nur Laien,Lehrer,Theoretiker,Fachbuchautoren und andere Deppen */
        /* und schon allein deswegen ist die Verwendung von realloc statt VLA sinnvoll */
        /* realloc verlangt einen Zeiger auf bestehenden Speicher, der vergrößert werden soll UND einen numerischen Wert, auf den vergrößert werden soll */
        /* dazu musst du einen separaten Zähler definieren und mitlaufen lassen */
        int i;
        for (i=0;i<number;i++) {
            scanf(" %[^\n]", temp); /* ich bezweifle, dass du weißt, was " %[^\n]" macht; sollte "%4999[^\n]" heißen */
            array_string [i] = (char*)malloc((strlen(temp)+1)*sizeof(char)); /* sinnfreier Cast */
            strcpy(array_string[i], temp);
        }
        
        
        size_t large = sizeof(array_string) / sizeof(char *);
        qsort(array_string,large ,sizeof(char *) ,cstring_cmp );
        printf ("\n"); /* besser puts */
        printf ("the sorted array list is:\n"); /* besser puts */
        for (i=0;i<large;i++)
            printf("%s\n", array_string [i]);
    
        /* hier gehört die Freigabe (mit free) aller malloc/realloc hin */
        return 0;
    }
    

Anmelden zum Antworten