Brauche Hilfe bei C-Programm



  • Hey,
    bin ein totaler Neuling in Sachen programmieren und soll ein C-Programm schreiben, welches in einer Zeichenkette doppelte oder mehrere gleiche Zeichen findet und dann auf ein Zeichen reduziert.
    Als Beispiel, "halllo" soll zu "halo" werden.
    Hab schon nen bischen was geschrieben, was auch funktioniert bei z.B. 4 oder 5 gleichen Zeichen.
    Sobald es aber mehr Zeichen werden bekomm ich ne Fehlermeldung "programm.exe funktioniert nicht mehr".
    Wäre euch echt dankbar wenn ihr mir da weiter helfen könntet.
    Programm steht unten drunter 😉

    Mfg

    Birdy

    oh sorry, habs gleich mal geändert



  • Erstens: sfds (hier will kaum jemand 100 Zeilen unformatierten Code lesen und deuten)

    Zweitens: Schnapp dir mal einen Debugger und verfolge im Einzelschritt-Verfahren, an welcher Stelle der Fehler genau auftritt.

    Drittens: Warum alles per Hand kopieren? Dafür gibt es doch strcpy(), memmove() und Kollegen.

    PS: Unter C++ hätte ich dir jetzt std::unique() empfohlen 😉



  • Viertens: Sowas gehört in das passende Subforum.



  • Fünftens: Blubb..

    void del(const char *s, char *buf)
    {
      char last = '\0';
      for (; *s; ++s)
      {
        if (*s != last)
          *buf++ = last = *s;
      }
      *buf = '\0';
    }
    


  • Ist wahrscheinlich ne doofe Frage, aber cooky was ist das? 😛
    Bei Zeile 40 (HelpArrayPtr = new char;) ist anscheinend der Fehler?
    Da springt der raus und öffnet neue Fenster wie dbgmalloc.cpp oder new.cpp.
    Ist das normal, oder muss da vielleicht irgendwas anderes hin?



  • Birdy schrieb:

    Ist wahrscheinlich ne doofe Frage, aber cooky was ist das? 😛

    sieht aus wie eine etwas kompaktere Lösung für dein ursprüngliches Problem 😃

    Bei Zeile 40 (HelpArrayPtr = new char;) ist anscheinend der Fehler?

    Welche Sprache verwendest du denn eigentlich? new hat in einem C Programm nichts verloren - und außerdem reservierst du dort Platz für genau EIN Zeichen und schreibst danach über das Ende dieses reservierten Speicherbereichs hinaus.



  • Ja genau, sollte in C sein, mit C++ oder so haben wir nichts gemacht. Oh man, alles nicht so einfach 😛
    Aber wie bekomm ich dass denn hin das ich genug Speicherplatz im Hilfs-Array hab, bzw wie bekomm ich das mit dem Hilfs-Array anders hin? Irgendwie verzweifel ich gerade nen bischen dadran.



  • Erstens: new und delete existieren in C nicht, das sind Speicher-Operatoren aus C++. In C verwendet man dafür malloc() und free().
    Zweitens: Du mußt vor dem Reservieren des Speichers wissen, wieviel Platz du benötigst (hier kannst du den Platzbedarf per strlen() abschätzen).
    Drittens: Für dein Problem benötigst du überhaupt kein Hilfsarray - da die übrigbleibenden Buchstaben nur nach vorne aufrücken müssen, kannst du auch direkt im Original-Array umkopieren.

    Wie schon gesagt, in C++ hätte ich mich auf die vorhandenen Möglichkeiten verlassen und std::unique() verwendet, in C hätte ich es vermutlich nachgebaut:

    void unique(char* text)
    {
      int rpos,wpos;
      for(rpos=1,wpos=1;text[rpos];++rpos)
      {
        if(text[rpos]!=text[wpos-1])
        {
          text[wpos]=text[rpos];
          ++wpos;
        }
      }
      test[wpos]='\0'
    }
    

    (ungestestet und vermutlich noch optimierungsfähig)


Anmelden zum Antworten