ersetzen



  • aber ich will ja einen mit 2 austauschen 😕 😕

    mfg saroll 🤡 🤡



  • naja dann must dus selbst schreiben ganz easy
    als erstes suchst ob ein solches zeichen vorkommt wenn ja
    splittest du den string in 2 teile, fügst die 2 zeichen am ersten string an und dann wieder anhängen



  • da kommen bei mir immer endlosschleifen raus 😞 😞



  • Wie versuchst du es denn? (Code)



  • jetzt muss ich mich wieder für mein gepfusche schämen 😞 😞

    while(strlen(Temp3)>0);
                    {strcpy(Temp3,Temp4+i);
                     Temp3[i]='\0';
                     if(Temp3[0]=='(')
                       {strcpy(Temp2+i,"\(");
                        i++;
                       }
                     if(Temp3[0]==')')
                       {strcpy(Temp2+i,"\)");
                        i++;
                       }
    
                     i++;
                    }
    

    mfg saroll 😞🤡



  • Wie wäre es wenn du es ganz primitiv machst:

    while(*str)
    {
      if(*str=='(')
      {
        *buffer++='\\';
        *buffer++='(';
      }
      else if(*str==')')
      {
        *buffer++='\\';
        *buffer++=')';
      }
      else
      {
        *buffer++=*str;
      }
      ++str;
    }
    *buffer=0;
    strcpy(str, buffer);
    

    schön simpel und einfach

    btw: deinen code kapier ich nicht



  • Brauchst dich nicht schämen. Jeder fängt mal klein an ;).

    An der Programm-Logik des Ersetzens sollten wir allerdings noch etwas arbeiten. Versuch mal zu beschreiben, wie du einen Ersetzenvorgang machen würdest (ohne mal ans Programmieren zu denken). Stell dir einfach mal vor du hast einen Satz und musst darin bestimmte Wörter durch andere Wörter ersetzen. Wie gehst du vor?

    Wenn du Schwierigkeiten hast dir das vorzustellen, dann mach es einfach mal auf Papier. Schreib dir einen Satz auf, ein Suchwort und die Ersetzung auf und versuche dann den Ersetzenvorgang Schritt für Schritt nachzuvollziehen. Schreib dabei den neuen nach und nach entstehenden Satz extra wo hin (also nicht am originalen Satz rumdoktorn ;)).



  • ... das prog hängt sich auf ...
    😞 😞 😞

    mfg saroll 🤡🤡🤡



  • An der Programm-Logik des Ersetzens

    Beim ersten Überfliegen habe ich glatt "An der Programm-Logik des Entsetzens" gelesen 😃😋

    @Saroll: Welches Programm hängt sich auf? Deines? Shades? Das, das du dir aufgeschrieben hast?

    Also versuch mal den Algorithmus in Worte zu fassen, dann ist es auch einfach den nach C zu übersetzen. Du hast 8 Schachteln und willst dort bestimmte Buchstaben durch 2 andere setzen. Aber in eine Schachtel passt nur ein Buchstabe, also muss der Rest nach hinten verschoben werden -> du benötigst auch mehr Schachteln. Nur so als Denkansatz noch: Zuerst zählen wieviele Buchstaben es werden, danach soviel Speicher holen, danach erst die Buchstaben ersetzen - am besten so wie Shade, der neu geholte Speicher ist in dem Fall dann buffer.

    MfG SideWinder



  • also: wie ich mir das vorstelle

    ich nehme den satz und schau mir zeichen für zeichen an
    wenn ich das zeichen gefunden habe dann lege ich den satzteil vor dem zeichen ab und geb das dazu was statt dem ersetzten hingehört...
    dann lösch ich das zu ersetzende und tu den restlichen teil des satzes wieder dran... oder ich suche halt weiter ob es noch einen zu ersetzenden teil gibt...

    shades programm hängt sich auf... :(:(

    mfg saroll 🤡🤡🤡



  • Hängt sich auf = Endlosschleife oder Hängt sich auf = Segmention Fault?

    Denk dran, wieviel Speicher sein buffer haben muss. Du kannst nicht einfach damit rechnen, mehr Schachteln zu haben!

    MfG SideWinder



  • es hängt sich auf: "senden / nicht senden von windows" meldung kommt...



  • Lass mal deine komplette Implementierung sehen, das was du jetzt mit Shades Code ausführst + Variablendeklarationen. Es fehlt sicher an Speicherplatz 🤡

    MfG SideWinder



  • variablen:

    char *str,*buffer;
    

    der rest:

    strcpy(str,Temp2);
               while(*str)
                    {
                     if(*str=='(')
                       {
                        *buffer++='\\';
                        *buffer++='(';
                       }
                     else if(*str==')')
                       {
                        *buffer++='\\';
                        *buffer++=')';
                       }
                     else
                       {
                        *buffer++=*str;
                       }
                        ++*str;
                       }
                        *buffer=0;
                        strcpy(Temp2, buffer);
    

    mfg saroll 🤡🤡🤡



  • Ja und wo zählst du jetzt wieviel platz buffer benötigt und wo hat buffer seinen Speicherplatz?

    Der arme Puffer hat keinen Speicherplatz 🤡

    MfG SideWinder



  • *heul*
    ich kenn mich nicht mehr aus 😞 😞 😞 😞

    und wie geb ich dem blöden buffer speicherplatz??
    mit dem malloc zeug??
    oder gehts auch einfacher??



  • mach so

    /* 
    entweder du nimmst eine fixe groesse wie hier oder du schreibst eine funktion die zählt wie viele zeichen ausgetauscht werden und dann ist halt 
    der buffer um die Anzahl dieser zeichen groesser als der string
    
    buffer = (char*) malloc (sizeof(src_string) + count);
    
    machs aber am anfang mit fixer groesse
    */
    
    char buffer[50];
    
    void tausche_aus(src_string, buffer); // Funktionsaufruf
    


  • Unser Algorithmus sieht grundsätzlich so aus:

    Zeichen ansehen
        if Zeichen == bestimmtesZeichen then
            Zeichen = neuesZeichenTeil1
            verschiebe_buffer_ab_zeichen_nach_hinten(str)
            Zeichen+1 = neuesZeichenTeil2 // wenn wir nicht verschieben würden, würde hier etwas verloren gehen
        else
            Zeichen = altesZeichen
    Nächstes Zeichen ansehen
    

    Schwierig umzusetzen ist in C das verschieben, da ein Array zu einem Zeitpunkt immer nur eine fixe Größe hat und sich nicht dynamisch vergrößert. Wir könnten alles um eins nach hinten verschieben, bloß wohin mit dem letzten Zeichen?

    Also arbeiten wir in C anders, wir legen uns einen TempBuffer an (bei Shade buffer) der die Größe hat die wir benötigen:

    // Speichergröße "berechnen"
    BenoetigterPlatz = 0
    
    Zeichen ansehen
        if Zeichen == bestimmtesZeichen then
            BenoetigterPlatz += 2
        else
            BenoetigterPlatz += 1 // BenotiegterPlatz++
    Nächstes Zeichen ansehen
    
    // Speicherplatz holen (TempBuffer anlegen), C-Code:
    char* buffer = new char [BenoetigterPlatz + 1]; // + 1 ist deshalb nötig, weil C immer noch ein 0 am Ende eines Strings haben will und das wollen wir auch einfügen
    
    // Shades Algorithmus
    DerzeitigesZeichen = 0
    
    Zeichen ansehen
        if Zeichen == bestimmtesZeichen then
            buffer[DerzeitigesZeichen] = neuesZeichenTeil1
            buffer[DerzeitigesZeichen] = neuesZeichenTeil2
            DerzeitigesZeichen += 2
        else
            buffer[DerzeitigesZeichen] = Zeichen
            DerzeitigesZeichen += 1
    Nächstes Zeichen ansehen
    
    // 0 anfügen, damit es ein "echter" C-String wird:
    buffer[DerzeitigesZeichen] = 0
    
    // Damit der User aber nicht ab jetzt mit buffer arbeiten muss sondern weiterhin mit str arbeiten kann hängen wir den String jetzt um:
    
    // Alter String kann gelöscht werden, C-Code
    delete [] str
    
    // Alten String auf neuen String zeigen lassen, C-Code
    str = buffer
    

    Hoffentlich war das verständlich und fehlerfrei 🙂

    MfG SideWinder



  • Statt new und delete natürlich malloc und free benützen 🙂

    *C++ geschädigt bin*

    MfG SideWinder



  • ne, du, irgendwie hab ich das nicht verstanden 😞
    ich bin und bleib dumm...

    mfg trauriger saroll 🤡


Anmelden zum Antworten