String kürzen
-
Danke für die schnelle Antwort...
Soweit war ich leider auch schon...Der Zeiger zeigt auf das '='.N320 $P_UIFR[R0]=CTRANS(C,R122,X,0,Y,0,Z,R112)
Nur viel lösche ich den Teil davor ? Muss ich die Zeilen bis zum '=' zählen und dann löschen? Oder geht das einfacher ?
Benjamin
-
Machs mit der Funktion:
int ParseTokens( CStringArray& result, CString szString, CString szTokens){ int iNum = 0; int iCurrPos= 0; CString subString; while( -1 != ( iCurrPos = szString.FindOneOf( szTokens ) ) ) { iNum++; result.Add( szString.Left( iCurrPos ) ); szString = szString.Right( szString.GetLength() - iCurrPos - 1 ); } if ( szString.GetLength() > 0){ iNum++; result.Add( szString ); } return iNum; }
aufruf:
CString str="test=1234" CStringArray r; int iNum = ParseTokens( r, str, "="); if(iNum>0){ CString vor_dem_zu_suchenden_zeichen=r[0]; CString hinter_dem_zu_suchenden_zeichen=r[1]; }
-
while( fgets( Zeile, 200, fpIn ) ) { if( strstr(Zeile,"=CTRANS(") ) memmove(Zeile,strstr(Zeile,"=CTRANS(")+1,strlen(strstr(Zeile,"=CTRANS("))); ... }
Bei Bedarf den Suchstring anpassen, ein bloßer Suchstring "=" würde bei jedem 1. Vorkommen von "=" in Zeile greifen.
-
LordTerra schrieb:
int ParseTokens( CStringArray& result, CString szString, CString szTokens)
Ist hier im Forumteil irgendwo ein C++ Leck?
-
Der Zeiger zeigt auf das '='.
N320 $P_UIFR[R0]=CTRANS(C,R122,X,0,Y,0,Z,R112) ^^ z| z+1
> Nur viel lösche ich den Teil davor ?
Du mußt die nicht löschen.Wenn z auf das '=' zeigt, zeigt z+1 auf das Zeichen dahinter.
Wenn du mit dem vorgeschlagenen zeil arbeitest brauchst du es nicht löschen, da zeil beim '=' anfängt. Das davor ist nicht sichtbar.
dann ist Zeile :N320 $P_UIFR[R0]=CTRANS(C,R122,X,0,Y,0,Z,R112)
und z oder zeil:
=CTRANS(C,R122,X,0,Y,0,Z,R112)
und z+1:
CTRANS(C,R122,X,0,Y,0,Z,R112)
Oder beim kopieren mit strcpy(Zeile,z) da wird der String auf den z zeigt nach Zeile geschrieben. Hast du das mal ausprobiert?
-
Hallo zusammen,
leider habe ich es erst heute früh testen können, aber die Variante von Wutz und DirkB finde ich am elegantesten. Kannte den Befehl 'memmove' vorher garnicht.
Vielen Dank !
-
nochmals zu dem memmove:
ich wollte gerne diese Zeile:
N170 DrehANF:
in diese Zeile umwandeln:
ALABEL
wenn ich die jedoch mit dem folgenden Code realisieren möchte:
if ( Replace( Zeile, "ANF:", "ALABEL" )) { memmove(Zeile,strstr(Zeile,"ALABEL"),strlen(strstr(Zeile,"ALABEL"))); }
wobei die Zeile =
"N170 DrehANF:"
ist.
erhalte ich:
ALABEL BALABEL
Woher kommt jetzt die Zweite Zeile?
Danke im Voraus !
-
Evtl ist noch ein "\r\n" am Ende vom String.
Zudem kopiert memmove das abschließende '\0' nicht mit. Du musst bei der Länge halt strlen()+1 schreiben.
-
leider enhält der String kein "\r\n"...und wenn ich
if ( Replace( Zeile, "ANF:", "ALABEL" )) memmove(Zeile,strstr(Zeile,"ALABEL")+1,strlen(strstr(Zeile,"ALABEL")+1));
schreibe, verändert sich die Ausgabe wie folgt:
LABEL ABALABEL
Ich habe schon mehreres versucht, komme aber nicht zum gewünschten Ergebnis...
-
Die Länge muss +1, nicht die Anfangsposition vom gefundenen String.
memmove(Zeile, strstr(Zeile,"ALABEL"), strlen(strstr(Zeile,"ALABEL"))+1);
Wie sieht den die Zeile vor dem memmove aus
printf("<%s>\n", Zeile);
Durch die <> kannst du leicht Leerzeichen und \r\n erkennen.
-
jetzt passt es ! Es lag wirklich an der +1. Die muss ja an die Länge..Klar...
Danke dir...