Probleme bei der Stringlänge
-
Hallo,
ich habe einen String mit einer Länge von 0-16 Zeichen.
Diesen String muss ich nun in ein Zweidimensionales Array kopieren.
Dazu brauch ich nun ein Array mit 4 mal 4 Feldern.for(j=0; j<4; j++) { hex[10][j] = szDescription[j]; hex[11][j] = szDescription[j+4]; hex[12][j] = szDescription[j+8]; hex[13][j] = szDescription[j+12]; }ich hatte vor es so zu machen.
Wenn der String aus 16 Zeichen besteht ist das auch kein Problem, hat er allerdings weniger Zeichen bekomme ich ein ASSERT, da ich dann wohl ne leere Stelle hab, die ich kopieren möchte.Hat jemand eine Idee, wie man so was machen kann??
-
Was für einen String hast du denn vorliegen? (char*, CString, std::string, was anderes?) Eine Möglichkeit wäre es, vor jedem Speicherzugriff zu überprüfen, ob der String lang genug ist:
for(j=0; j<4; j++) { int len=szDescription.GetLength(); if(len>j) hex[10][j] = szDescription[j]; if(len>j+4) hex[11][j] = szDescription[j+4]; if(len>j+8) hex[12][j] = szDescription[j+8]; if(len>j+12)hex[13][j] = szDescription[j+12]; }Wesentlich eleganter ist es, den String vorher auf die nötige Länge zu bringen:
if(szDescription.GetLength()<16) szDescription.GetBufferSetLength(16); for(...) ... szDescription.ReleasBuffer();
-
ich habe einen CString.
Ich habe den String nun auf die gewünschte Länge gebracht indem ich einfach " " anhänge.int StringLength1 = GetView()->szDescription.GetLength(); for(int k=0; k<(16-Stringlength1); k++) szDescription += " "; for(j=0; j<4; j++) { hex[10][j] = GetView()->szDescription[j]; hex[11][j] = GetView()->szDescription[j + 4]; hex[12][j] = GetView()->szDescription[j + 8]; hex[13][j] = GetView()->szDescription[j + 12]; }
-
Was macht denn szDescription.GetBufferSetLength(16); und szDescription.ReleasBuffer(); genau??
-
Warum schaust du dazu nicht in der MSDN nach, da sind die Methoden erklärt

GetBufferSetLength() gibt einen char*-Buffer auf den String-Inhalt heraus und setzt zusätzlich die Länge des Strings (eine reine SetLength()-Methode habe ich in der CString nicht gefunden, obwohl die mir lieber gewesen wäre). ReleaseBuffer() gibt diesen Buffer wieder frei und berechnet die Stringlänge neu.
-
Welche Methode würdest du für sauberer halten, deine oder meine? Und warum?
-
Das kommt ganz darauf an, ob und wie du fehlende Eingabewerte kennzeichnen willst. Ich würde ehrlich gesagt keine von beiden verwenden, sondern mit std::string arbeiten. Oder ich würde einen zu kurzen Eingabestring von vornherein zurückweisen mit einer Fehlermeldung an den Benutzer.
-
Also zurückweisen geht nicht, der Benutzer kann frei entscheiden wieviele chars er setzt.
Da der String an ein gerät gesendet wird benutze ich meine Methode, da dort jedes Space mit einer "20" codiert ist.
Bei deiner Methode werden dabei nicht gesetzte chars mit "CD" codiert.
was das Gerät dann später ausgeben würde, ist mir dann unklar.
-
maRKus23 schrieb:
Also zurückweisen geht nicht, der Benutzer kann frei entscheiden wieviele chars er setzt.
Da der String an ein gerät gesendet wird benutze ich meine Methode, da dort jedes Space mit einer "20" codiert ist.
Bei deiner Methode werden dabei nicht gesetzte chars mit "CD" codiert.Also unter diesen Bedingungen ist deine Version vermutlich besser (oder das Zielgerät muß vor der Ausgabe überprüfen, was für Werte es bekommt). Aber da stellt sich die Frage, warum du den String überhaupt umsortieren willst.
PS: Deine andere Frage habe ich ins .NET Board verschoben.
-
ich kann an das Gerät immer nur 4 Bytes senden, wegen firmware, deswegen das Array, haste das gemeint mit umsortieren?
Ich sende noch mehr Werte und die sind halt alle in dieser Form.