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...


Anmelden zum Antworten