else if Problem

cwriter

Erfahrenes Mitglied
Hallo Welt
Ich habe ein Problem mit Schleifen: Das Programm soll einen c-Kommandofenstercode in einen php-Code umwandeln.

Code:
#include "stdlib.h"
#include "windows.h"
#include "stdio.h"
#include "conio.h"
#include "time.h"


int main(int argc, char *argv[])
{   
    char Eingabe[256];
    char Lesen[2048];
    char* pch;
    int lines=0;
    
    FILE* f;
    FILE* fp;
    
    
    printf("Gib den Namen der .php Datei an:\n");
    scanf("%s",&Eingabe);
    strcat(Eingabe,".php");
    
    f=fopen(Eingabe,"w+");
    fprintf(f,"<?php\n");
    printf("Gib den Namen der umzuwandelnden Datei an:\n");
    scanf("%s",&Eingabe);
    strcat(Eingabe,".c");
    fp=fopen(Eingabe,"r");
    while(fgets(Lesen,2048,fp)!=0) lines++;
    printf("\n\n%d lines found. ",lines);
    if(lines==0)
    {
       printf("No Data found. Ending...\n");
       return 0;
    }
    else
    {
       printf("\n\n");
    }
    fseek(fp,0,SEEK_SET);
    lines=0;
    label: printf("");
    while(fgets(Lesen,2048,fp)!=0)
    {
       lines++;
       if(strstr(Lesen,"#")!=NULL) 
       {
          printf("Deleted: Define\n");
       }
       if(strstr(Lesen,"int main")!=NULL) 
       {
          printf("Deleted: main()\n");
          goto label;
       }
       if(strstr(Lesen,"printf")!=NULL) 
       {
          printf("Changed: printf() to echo\n");
          pch=strtok(Lesen,"\"");
          pch=strtok(NULL,")");
          fprintf(f,"echo \"%s;\n",pch);
       }
       if(strstr(Lesen,"char")!=NULL)
       {
          fprintf(f,"$");
          pch=strtok(Lesen," ");
          if(strstr(Lesen,"]")!=NULL)
          {
             pch=strtok(NULL,"]");
             fprintf(f,pch);
             fprintf(f,"];\n");
          }
          else
          {
             pch=strtok(NULL,";");
             fprintf(f,pch);
             fprintf(f,";\n");
          }
          
       }
       if(strstr(Lesen,"int")!=NULL)
       {
          fprintf(f,"$");
          pch=strtok(Lesen," ");
          pch=strtok(NULL,";");
          fprintf(f,pch);
          fprintf(f,";\n");
       }
       if(strstr(Lesen,"short")!=NULL)
       {
          fprintf(f,"$");
          pch=strtok(Lesen," ");
          pch=strtok(NULL,";");
          fprintf(f,pch);
          fprintf(f,";\n");
       }
       if(strstr(Lesen,"long")!=NULL)
       {
          fprintf(f,"$");
          pch=strtok(Lesen," ");
          pch=strtok(NULL,";");
          fprintf(f,pch);
          fprintf(f,";\n");
       }
       if(strstr(Lesen,"puts")!=NULL)
       {
          printf("Changed: puts() to echo\n");
          pch=strtok(Lesen,"(");
          pch=strtok(NULL,")");
          fprintf(f,"echo $%s;\n",pch);
       }
       if(strstr(Lesen,"return 0")!=NULL)
       {
          printf("Taken: return 0 to return 0\n");
          fprintf(f,Lesen);
       }
       if(strstr(Lesen,"return")!=NULL)
       {
          printf("Changed: return to return\n");
          pch=strtok(Lesen,"r");
          pch=strtok(NULL," ");
          pch=strtok(NULL,";");
          fprintf(f,"return $%s;\n",pch);
       }
       if(strstr(Lesen,"{")!=NULL)
       {
          printf("Begin: {\n");
          fprintf(f,"{\n");
       }
       if(strstr(Lesen,"}")!=NULL)
       {
          printf("End: }\n");
          fprintf(f,"}\n");
       }
       if(strstr(Lesen,"if")!=NULL)
       {
          printf("Taking: if to if\n");
          pch=strtok(Lesen,"(");
          pch=strtok(NULL,")");
          fprintf(f,"if(%s)\n",pch);
       }
       
       else
       {
           printf("Line %d: Error: Foreign Function: %s",lines, Lesen);
           printf("   ->including as comment.\n");
           fprintf(f,"//%s",Lesen);
       }
    }
    fprintf(f,"\n?>\n");
        
    system("PAUSE");
    return 0;
}

Wenn diese Schleife so ist:
Code:
 else
       {
           printf("Line %d: Error: Foreign Function: %s",lines, Lesen);
           printf("   ->including as comment.\n");
           fprintf(f,"//%s",Lesen);
       }
bezieht sich das else logischerweise auf das vorhergehende if. Wenn ich aber überall ein else if hinpflastere, wird jedes mal eine neue Zeile "geöffnet", sodass man keine 2 Funktionen auf einer Zeile habe kann, was recht unpraktisch ist.
Wie kann ich machen, dass sich das letzte else auf alle if's bezieht?

Wahrscheinlich ist die Lösung recht einfach, aber ich komm' einfach nicht drauf...

cwriter
 
Wenn ich aber überall ein else if hinpflastere, wird jedes mal eine neue Zeile "geöffnet", sodass man keine 2 Funktionen auf einer Zeile habe kann, was recht unpraktisch ist.

Ich verstehe nicht genau, was du damit meinst. Kannst du da mal bisschen Code zeigen, der das genauer erläutert was du meinst? Das was du versuchst zu erreichen wird in der Regel schon über if-else if-else erreicht.
 
Hi.

@cwriter: So wie du das jetzt machst bzw. vorhast wird das doch sowieso ein heilloses Durcheinander was du dort generierst. Du suchst in einer Zeile nach beliebigen Schnipseln, d.h. es ist egal ob da nun "cliff" steht, du siehst "if" und bei der Reihenfolge kommst du auch komplett durcheinander.

Du könntest einen Compiler generieren lassen. Es gibt im Netz schon fertige Grammatiken für C. Z.B. mit flex und bison.

Gruß
 
Hallo,

Also wenn ich dein Problem richtig verstanden habe solltest du es so lösen, das du eine boolsche variable hast, die angibt, ob eine der if-Abfragen zugetroffen hat. D.h. anstatt else steht dort
Code:
bool mindestensEineIfAbfrageWurdeAusgefuehrt = false;

if(strstr(Lesen,"printf")!=NULL){
           mindestensEineIfAbfrageWurdeAusgefuehrt = true;
           //weiter im text
}
//nächste if abfrage
// mindestensEineIfAbfrageWurdeAusgefuehrt auf true setzen

// ...

if (!mindestensEineIfAbfrageWurdeAusgefuehrt){
           printf("Line %d: Error: Foreign Function: %s",lines, Lesen);
           printf("   ->including as comment.\n");
           fprintf(f,"//%s",Lesen);
}

Außerdem empfiehlt es sich, die einzelnen Tokens in eine Liste zu schreiben und diese in einer seperaten Funktion abzuarbeiten und nur den zu zurückgegebenden String auszugeben.
 
Zuletzt bearbeitet:
Danke random-access!
Das einzige Problem an deinem Script war das bool. Kennt c halt nicht. Ich habe es auf int und true auf 1 und false auf 0 geändert. Nochmals danke!

cwriter
 
Zurück