Nach X Zeilen einen Umbruch machen.



  • Hallo

    Ich suche eine funktion, wo ich nach X Zeichen (Wörter sollennicht unterbrochen werden) eine \n reinmachen kann. Wie mach ich sowas? Kenn mich mit zeiger nich so gut aus. danke für hilfe.

    tommy xp



  • du solltest deine Frage besser formulieren. Wo willst du das \n hinzufügen? In einer Datei? In einem String Puffer? Fragen über Fragen.



  • oh, entschuldigung, da habe ich wohl echt was vergessen. Natürlich in einem buffer.

    danke



  • ok, dann ist man: memmove(3) was du suchst.

    /* angenommen, wie haben genug Speicher */
    
    void insert_new_line(char *str, size_t x)
    {
        size_t len_t;
        char *tmp = str+x;
    
        len_t = strlen(tmp);
    
        memmove(tmp + 1, tmp, len_t + 1); /* +1 damit \0 mitkopiert wird */
    
        *tmp = '\n';        
    }
    

    sollte so gehen

    edit: die Funtion hab ich on-the-fly geschrieben, d.h. ohne Sicherheitsüberprüfungen. Du solltest überprüfen, ob 0 <= x <= strlen(str) und außerdem, dass der buffer, auf den str zeigt, mindestens strlen(str) + 2 Elemente speichern kann, d.h. ggf. vor dem Aufruf von insert_new_line realloc ausführen oder die Funktion dementsprechend verändern.



  • Danke 😉 Voll cool. Wieso benennst du die Variabeln (für mich) so komisch (len_t) Was soll das ausgeschrieben bedeuten? length_type?

    danke



  • len_t für length_tmp 😉



  • Aber so unterbrichst du ja Wörter. Du kannst memmove nicht nehmen, sondern musst durchgehen und dir die letzte Position eines Leerzeichen merken. Das kannst du dann durch ein \n ersetzen, wenn du X Zeichen gezählt hast und fängst bei der Stelle + 1 wieder an.

    ungetestet sähe die Funktion so aus

    #include <assert.h>
    #include <ctype.h>
    
    void unterbreche_nach_x_zeichen(char *buf, size_t x) {
      assert(buf);
      for(size_t i = 0; buf[i;) {
        char *leerzeichen = 0x0;
        for(; i < x; ++i) {
          if(!buf[i])
            return;
          else if(isspace(buf[i]))
            leerzeichen = &buf[i];
        }
        if(!leerzeichen) {
          // Ein Wort der Länge x, was nu? unterbrechen, aufhören, ignorieren?
        }
        else {
         *leerzeichen = '\n';
         i = leerzeichen - buf + 1;
         x += i;
        }
      }
    }
    


  • rüdiger schrieb:

    ungetestet säh die Funktion so aus

    ...
    

    auch ungetestet:

    void unterbreche_nach_x_zeichen (char *buf, long x)
    {
       long old_x;
    
       for (old_x=x; *buf; buf++, x--)
          if (*buf == ' ' && x <= 0)
          {
             *buf = '\n';
             x = old_x;
          }   
    }
    

    aber die 'sparversion' 😉



  • supertux schrieb:

    len_t für length_tmp 😉

    Boah, das ist ja übel 😃



  • Tim schrieb:

    supertux schrieb:

    len_t für length_tmp 😉

    Boah, das ist ja übel 😃

    ich wollt's auch schon bemängeln...
    🙂


Anmelden zum Antworten