übertrittsfehler??



  • genau, es wird jedes mal eine Zeile in zeile eingelesen (d.h. bis ein Zeilenumbruch '\n' gelesen wird) und zwar maximal sizeof(zeile)-1 Zeichen und an letzte Stelle wird ein Stringendekennzeichen '\0' gesetzt. So geht's



  • ich weiß ich nerve aber ich poste noch mal meinen sourcecode...
    ich glaub ich hab schon wieder einen buffer overflow 🤡

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <iostream.h>
    #include <conio.h>
    
    void Umschreiben(char *Alles, char *Text1, int wo)
    {strncpy(Text1,Alles, wo);
     Text1[wo]=0;
     strcpy(Alles,Alles+wo);
    }
    
    int Suchen(char *Alles, int wo)
    {int laenge=strlen(Alles);
     do
      {wo++;
       if(wo==laenge)
        {wo=0;
         break;
        }
      }while(Alles[wo]!='\x1B');
     return(wo);
    }
    
    int main()
    {char *token, seps[]="\x1B", Alles[10000], Text1[100], Text2[100], Fertig[10000], Temp[10000];
     int wo=1,laenge, restore=0;
     double koordx,koordy;
     int zeichen=0, ende=0;
    
     while(fgets(Alles, sizeof(Alles), stdin))
     {*Temp=0;
      wo=Suchen(Alles,wo);
      strcat(Temp,token = strtok( Alles, seps ));
      while( token = strtok( NULL, seps ))
           {strcat(Temp,token);
    
         if(*Temp=='E')
           {strcat(Temp,token = strtok( Alles, seps ));
           }
         strcpy(Text1,Temp);
         if(strncmp(Temp,"E%-1",4)==0)
           {strcat( Fertig, "%! " );
           }
    
         if(strncmp(Temp,"&l1O",4)==0)
           {strcat( Fertig, "90 rotate 1000 20 translate " );
           }
         if(strncmp(Temp,"&l0O",4)==0)
           {strcat( Fertig, "800 1000 translate " );
           }
         if(strncmp(Temp,"\22",3)==0)
           {strcat( Fertig, "-10 0 rmoveto " );
           }
         if(strncmp(Temp,"(19U",4)==0)
           {strcat( Fertig, "/Times-Italic findfont setfont " );
            if(Text1!="")
              {zeichen=1;
              }
           }
         if(strncmp(Temp,"(s0B",4)==0)
           {strcat( Fertig, "/Times-Roman findfont setfont " );
            strcpy(Text1,Text1+4);
            if(Text1!="")
              {zeichen=1;
              }
           }
         if(strncmp(Temp,"(s3B",4)==0)
           {strcat( Fertig, "/Times-Bold findfont setfont " );
            strcpy(Text1,Text1+4);
            if(Text1!="")
              {zeichen=1;
              }
           }
         if(strncmp(Temp,"(s1P",4)==0)
           {sprintf(Temp,"%f",koordx);
            strcat( Fertig, Temp);
            strcat( Fertig, " " );
            sprintf(Temp,"%f",koordy);
            strcat( Fertig, Temp);
            strcat( Fertig, " moveto " );
            strcpy(Text1," ");
           }
         if(strncmp(Temp,"(s16602T",8)==0)
           {strcpy(Text1," ");
           }
         if(strncmp(Temp,"(s",2)==0)
           {laenge=strlen(Temp);
            strncpy(Text2, Text1, laenge);
            Text2[laenge]=0;
            strcpy(Text1,Text1+2);
            laenge=strlen(Text1);
            strncpy(Text1, " ", laenge-1);
            Text1[laenge-1]=0;
            if(*Text2=='V')
              {strcat( Fertig, "gsave " );
               strcat( Fertig, Text1);
               strcat( Fertig, " scalefont setfont " );
               restore=1;
              }
           }
         if(strncmp(Temp,"*p",2)==0)
           {laenge=strlen(Temp);
            strncpy(Text2, Text1, laenge);
            Text2[laenge]=0;
            strcpy(Text1,Text1+2);
            laenge=strlen(Text1);
            strncpy(Text1, " ", laenge-1);
            Text1[laenge-1]=0;
            if(*Text2=='X')
              {koordx=atof(Text1);
               koordx=(koordx/11,77)*(-1);
              }
            if(*Text2=='Y')
              {koordy=atof(Text1);
               koordy=(koordy/11,77)*(-1);
              }
           }
         if(zeichen==1)
           {zeichen=0;
            strcat( Fertig, "('" );
            strcat( Fertig, Text1 );
            strcat( Fertig, "') show " );
            if(restore==1)
              {strcat( Fertig, "grestore " );
               restore=0;
              }
              }
         laenge=strlen(Alles);
    
      }}
    
     return 0;
    }
    

    *versteck* haut mich nicht!! 🤡

    mfg saroll



  • Erstmal sorry, dass ich mich jetzt erst melden kann. Hab dich nicht vergessen 😉

    Saroll schrieb:

    int Suchen(char *Alles, int wo)
    {int laenge=strlen(Alles);
     do
      {wo++;
       if(wo==laenge)
        {wo=0;
         break;
        }
      }while(Alles[wo]!='\x1B');
     return(wo);
    }
    

    Hier solltest du keine do{}while()-Schleife machen, sondern eine while(){}. Außerdem solltest du wo erst am Ende der Schleife um 1 erhöhen nicht gleich am Anfang.

    Saroll schrieb:

    int wo=1,laenge, restore=0;
    

    wo sollte mit 0 initialisiert werden. Wir wollen doch beim ersten Zeichen anfangen und nicht beim zweiten ;).

    Allgemein solltest du darauf schauen, dass auch bei jedem Schleifendurchlauf alles wieder initialisiert ist, was initialisiert sein sollte (besonders bei Strings und strcat()) bzw. ob bestimmte Sachen vor der Schleife richtig initialisiert sind (betrifft speziell Fertig[]). Außerdem solltest du darauf achten, dass du auch genügend Speicherplatz reserviert hast.


Anmelden zum Antworten