Position von String merken und dann wieder dahin springen



  • Mein Problem ist folgendes:

    Ich habe 3 Zeilen à 122 Pixel.
    Ich bekommen einen String geliefert. Diese bekomme ich Zeichen für Zeichen.
    Diesen String frage ich nun wortweise ab, in dem ich eine if-Schleife nutze.
    Nun schaue ich ob dieses Wort in die Zeile paßt. Ist dies der Fall wird geschaut ob dieses Wort mit dem nächsten zusammen in eine zeile paßt. Dabei soll jeweils die Position vom Wortanfang gemerkt werden. Paßt das erste und zweite wort nicht in die Zeile, wird die Anzahl der Zeilen hochgezählt und soll zur Postion vom Anfang des Wortes 2 gespringen, um von dort erneut mit dem Vergleich für Zeile 2 zubeginnen, ob Wort 2 und Wort 3 in die Zeile passen. Wie stelle ich das mit dem merken der Position an?

    unsigned int String[50];
    
    for (i=0; i < Länge String; i++)
    ....
    //in temp steht String drin (z.B. 0x0056)
    ...
    String[j] = temp;
    AnzahlZeile =0;
    
    if ((temp== 0x0020)||(i == (Länge String)-1))
    {
    //Abfragen von wortlänge (in Pixel) und vergleich ob in Zeile mit 122 Pixeln paßt
      if (wortlänge > 123)
         {
         AnzahlZeile++;
         ....
         }
    
    }
    


  • les dir mal was über zeiger durch



  • @neuer:
    wo ist das problem? mach eine zählervariable, die du immer aktualisierst, wenn du am anfang eines neuen wortes aktualisierst.
    zeiger ansehen solltest du aber trotzdem.

    Sovok schrieb:

    l*s

    bitte nicht. "lies", wenn schon. l*s ist nämlich noch schlimmer als v*aus. 🤡



  • les les les les les les les les les :p



  • ich bin mir nicht sicher, ob ich Dich verstanden habe.

    Ich habe verstanden, dass Du Text in drei Zeilen so ausgeben möchtest, dass kein Wort am Zeilenende zerschnitten wird, sondern in die nächste Zeile wandert, wenn es zu lang ist.
    Vielleicht ist es einfacher sich die Zeichen zuerst in einem Wort zu merken. In Quasi-Code etwa so:

    // zu merkende Variablen (evt. Member-Variablen einer Klasse):
    std::string m_aktWort; // das aktuelle Wort
    int m_iAktuelleZeile;  // Index auf die aktuelle Zeile
    ?? Zeilen[];
    
        char c = ...; // mein Zeichen
        if( IstSpaceZeichen( c ) )
        {
            if( 'in der Zeile[m_iAktuelleZeile] ist zu wenig Platz' ) // *1)
                ++m_iAktuelleZeile; // nächste Zeile
            'aktuelles Wort m_aktWort in Zeile[m_iAktuelleZeile] ausgeben'
            m_aktWort.clear(); // aktuelles Wort leeren
        }
        else // 'c' ist ein Zeichen im Wort
        {
            m_aktWort.push_back( c ); // Zeichen an Wort anhängen
        }
    

    Bleibt noch zu erwähnen, dass Du nach dem letzten Zeichen das letzte Wort noch in die aktuelle Zeile schreiben musst. Und bei *1) (s.o.) muss man evt. noch bedenken, dass ein Wort länger als eine Zeile werden kann.

    Du sprichst von Pixeln! Haben in Deiner Anwendung verschiedene Zeichen unterschiedliche Pixel-Breiten in der Darstellung?
    Wie sind Deine Zeilen im Code aufgebaut; und wie geschieht die eigentliche Ausgabe?

    Gruß

    Werner



  • @op:
    willst du eigentlich ALLE zeilenanfänge speichern? dann wäre eine liste (oder ein array) angebracht.
    also so:

    std::list<int> neue_zeile;
    neue_zeile.push_back(0);
    int aktuelles_wort_beginnt_bei = 0;
    for( int i = 0; i < satzlänge; ++i )
    {
      // hier die länge des buchstaben aufaddieren
      if( wort zu ende() )
      {
        if( dieses wort passt noch in die aktuelle zeile() )
        {
          aktuelles_wort_beginnt_bei = anfang des nächsten wortes;
        }
        else
        {
          ++zeilen;
          i = aktuelles_wort_beginnt_bei;
          neue_zeile.push_back(aktuelles_wort_beginnt_bei);
          aktuelle_zeilenlänge = 0;
        }
      }
    }
    

    jetzt hast du alle zeichen, die am zeilenanfang stehen in "neue_zeile" drin.
    aufpassen: wenn ein einziges wort mehr als eine zeile einnimmt, gibts ne endlosschleife.
    außerdem könntest du die länge des letzten wortes gleich mitspeichern, das würde bei jedem zeilensprung ein paar schleifendurchgänge sparen.

    Sovok schrieb:

    les les les les les les les les les :p

    *amoklauf.*

    oder lernst du französisch? 🤡


Anmelden zum Antworten