String kürzen



  • Hallo zusammen,

    ich lese zur Zeit eine Datei ein, die mehrere Zeilen enthält.
    Der Quellcode sieht zur Zeit folgendermaßen aus:

    while (( fgets( Zeile, 200, fpIn )) != NULL )
     {
            a = 1;                                          
            Replace( Zeile, "CYCLE", "L" );
            Replace( Zeile, "LONGHOLE", "L1001" );
            Replace( Zeile, "SLOT2", "L1002" );
    		if ( Replace( Zeile, "C=DC(", "C=" ))			
    		{
    			while ( Replace( Zeile, ")", "" ));
    		}
    
            if (( z = strstr( Zeile, "SPOS" )) != NULL )
                strcpy( z, "M19\n" );   
            Replace( Zeile, "MCALL", "M100" );
            if (( z = strchr( Zeile, '(' )) != NULL )   
            {                     
                while ( Replace( z, " ", "" ));         
                while ( Replace( z, ",,", ",0," ));    
                n = a;                                   
    
                sprintf( c, " R%d=", n++ );             
                Replace( Zeile, "(", c );               
                do
                    sprintf( c, " R%d=", n++ );           
                while ( Replace( Zeile, ",", c ));     
            }
    	    Replace( Zeile, "MCIRCLE", "M889" );
    	    Replace( Zeile, "MPOINT", "M888" );
    	    Replace( Zeile, "MDIA", "M890" );
    
    	if (( z = strchr( Zeile, ';' )) != NULL )   
                *z = '(';
            fprintf( fpOut, "%s", Zeile );
        }
        fclose( fpIn );
        fclose( fpOut );
        return 1;
    }
    

    Jetzt möchte ich aber folgende Zeile:

    N320 $P_UIFR[R0]=CTRANS(C,R122,X,0,Y,0,Z,R112)

    in diese Form bringen:

    CTRANS(C,R122,X,0,Y,0,Z,R112)

    Ich habe versucht nach dem '=' zu suchen und den Zeiger z gesetzt. Nur wie lösche ich alles vor dem Zeiger? Oder kennt jemand eine einfachere Möglichkeit, dies zu realisieren? Habe es mit strtok versucht, aber bin zu keinem Ergebnis gekommen.

    Danke im Voraus....



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du kannst
    eine Hilfsvariable char *zeil; benutzen und dann

    while (( fgets( Zeile, 200, fpIn )) != NULL )
     {
            zeil = Zeile;
            a = 1;                                          
            Replace( zeil, "CYCLE", "L" );
            Replace( zeil, "LONGHOLE", "L1001" );
            Replace( zeil, "SLOT2", "L1002" );
     .... usw. // also statt Zeile zeil schreiben
    

    dann kanst du mit z = strchr(zeil,'=') nach '=' suchen und wenn es ungleich NULL ist zeil = z+1; machen

    oder mit

    strcpy(Zeile,z+1);
    

    Aber es ist nicht sichergestellt das es klappt, da sich die Speicherbereiche überlappen. ⚠



  • 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