Strings zählen



  • Hallo,

    ich bin Programmieranfänger und habe die Aufgabe ein Programm zu schreiben, das Strings einliest bis stop eingegeben wird. Zum Schluss sollen die Strings wieder ausgegeben werden.
    Mehrfach eingegebene Strings/Zeilen sollen nur einmal ausgegeben werden, deshalb soll vor jedem String die Anzahl stehen, wie oft er eingelese wurde.

    Ich sollte einen Vektor von Pointern auf Zeichen, einen Zählvektor und einen Puffer für die Eingabe deklarieren.
    Beim Einlesen wird getestet, ob die Zeichenkette schon im Pointer-Vektor eingetragen ist.
    Falls ja, wird die Zählvektor-Komponente mit dem entsprechenden Indes hochgezählt.
    Falls nein - neuer string - soll auf dem heap Platz reserviert werden, in den die Zeichenkette genau passt. Anschließend wird der Puffer dorthin kopiert und ein Zeiger darauf in den Pointer-Vektor eingetragen.

    Mein Programm sieht wie folgt aus. Doch leider Funktioniert es nicht und ich weiß nicht warum. Google hat mir auch nicht weiterhelfen können.

    Hat jemand eine Ahnung, warum das Programm nicht funktioniert?
    Im voraus schon mal danke für die Antworten!!
    Lg Klaus

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define ANZAHL 5
    #define MAX 102
    
    int main()
    {
        int i = 0, m = 0, lange, neumax = MAX;
        char stop [] = { "ende\n\0" };
        char *zeichen;
        char puffer[MAX];
        int anzahl [128];
    for(i = 0;i<128; i++)
    {
        anzahl[i] = 1;
    }
    printf("Bitte geben Sie ihre Zeichenketten mit maximal 100 Stellen ein.\nMit Return koennen Sie die zweite Zeichenkette eingeben.\n\n");
    zeichen = malloc(MAX * sizeof(char));
    while (1)
    {
        fgets(puffer, MAX, stdin);
        for(i = 0; i<=m; i++)
        {
            if(puffer == zeichen[i])
            {
                anzahl[i]++;
            }
            else
            {
                zeichen[i] = (char)puffer;
                m++;
            }
        }
        lange = strlen(puffer);
        neumax += lange;
        zeichen = realloc(zeichen, neumax*sizeof(char));
        if(puffer == stop) break;
    }
    for(i = 0; i<=m; i++)
    {
        printf("[%d] %s \n", anzahl[i], zeichen[i]);
    }
        return 0;
    }
    


  • Überleg mal, was du in Zeile 31 zuweist und was du in Zeile 38 miteinander vergleichst.



  • Google wird dir da nicht weiterhelfen können, da du die Frage nicht genau stellen kannst

    Du hast den Unterschied zwischen char, char[] und *char nicht verstanden.
    Der wird in einem Buch erklärt.

    Zudem brauchst du auch ein *char[] (ein Array aus Zeigern auf char)



  • ...



  • Swordfish schrieb:

    //edit: Unnötigen Whitespace entfernt

    Immer diese C++-Programmierer. Vergessen return 0 am Ende, berücksichtigen nicht, dass fgets NULL zurückgeben kann und verwenden nicht fertige getline-Funktionen sondern schreiben sie jedesmal neu. Kein Wunder ist der Ruf von C hier im Forum so schlecht.

    Problemorientierter C-Code:

    #include <ctype.h>
    #include <limits.h>
    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    struct trie {
         int count;
         struct trie *next[(size_t)UCHAR_MAX+1];
    };
    
    struct trie* getnext(struct trie *t, unsigned char c)
    {
         if (t->next[c])
              return t->next[c];
         return t->next[c] = calloc(1, sizeof*t->next[c]);
    }
    
    void print_and_free_trie(struct trie *t, char *buf, int depth)
    {
         if (t->count > 0) {
              buf[depth] = '\0';
              printf("%3i \"%s\"\n", t->count, buf);
         }
         for (size_t i = 0; i<sizeof(t->next)/sizeof(*t->next); i++)
              if (t->next[i]) {
                   buf[depth] = (unsigned char)i;
                   print_and_free_trie(t->next[i], buf, depth+1);
              }
         free(t);
    }
    
    int main()
    {
         struct trie *root = calloc(1, sizeof*root);
         getnext(getnext(getnext(getnext(root, 's'), 't'), 'o'), 'p')->count = -1;
    
         size_t maxlen = 4;
    
         for (int i; (i = getchar()) != EOF;) {
              if ((unsigned char)i == '\n')
                   continue;
              size_t len = 1;
              struct trie *s = getnext(root, i);
              for (; (i = getchar()) != EOF && (unsigned char)i != '\n'; len++)
                   s = getnext(s, i);
              if (len > maxlen)
                   maxlen = len;
              if (!++s->count)
                   break;
         }
    
         char *buf = malloc(maxlen + 1);
         print_and_free_trie(root, buf, 0);
         free(buf);
    
         return 0;
    }
    

    Ist vermutlich sogar schneller als die idiomatische C++-Lösung.



  • ...


Log in to reply