2016-10-10 2 views
0

"Übung 1-23. Schreiben Sie ein Programm, um alle Kommentare aus einem C-Programm zu entfernen. Vergessen Sie nicht, in Anführungszeichen und Zeichen Konstanten richtig zu behandeln. C Kommentare verschachteln nicht." & K R pg.34K & R Exe. 1-23: Einige Komplikationen

Grundsätzlich habe ich zwei Fragen:

1) Ich bin völlig neue Codierung und ich wollte wissen, ob ich zumindest bin das Problem, den richtigen Weg zu denken.

2) Der Code wurde erstellt, um // bis \n oder /* bis */ zu ignorieren. Aber mit dem /* Kommentar bleibt immer eine /.


Input:abc/*comment*/123

Output:abc/123


Input:abc/*123

Outp ut:abc/


#include <stdio.h> 
char s[1000]; //Principal array 
int countS; //Number of char in array 

int deletSingleLineComments(void); 
int deletMultiLineComments(void); 

int main(void){ 
    int c; 
    while((c=getchar())!=EOF){ 
     s[countS]=c; 
     ++countS; 
    } 

    deletMultiLineComments(); //Function 1 
    deletSingleLineComments(); //Function 2 

    printf("\ns[]=\n%s\n\ncountS[]=%d\n",s,countS); 
} 



//Functions 1 
int deletMultiLineComments(void){ 
    char t[1000]; 
    int i=0; 
    int inComment=0; 
    int diff=0; 
    int a,b,c; 

    while(i<=countS){ 
     t[i]=s[i]; 
     ++i; 
    } 
    i=0; 

    while(i<=countS){ 

     if(t[i]=='/' && t[i+1]=='*'){ 
      inComment=1; 
     } 

     if(inComment==1){ 
      ++diff; //to equilibrate the number 
     } 

     if(inComment==0){ 
      s[i-diff]=t[i]; 
     } 

     if(t[i]=='*' && t[i+1]=='/'){ 
      inComment=0; 
     } 
     ++i; 
    } 
    s[i-diff+1]='\0'; 
    countS=i-diff; 

    printf("\nt[]=\n%s\n",t); 
} 



//Function 2 
int deletSingleLineComments(void){ 
    int i=0; 
    char t[1000]; 
    int inComment=0; 
    int diff=0; 

    while(i<=countS){ 
     t[i]=s[i]; 
     ++i; 
    } 
    i=0; 

    while(i<=countS){ 

     if(t[i] == '/' && t[i+1] == '/'){ 
      inComment=1; 
     } 

     if(t[i]=='\n'){ 
      inComment=0; 
     } 

     if(inComment==1){ 
      ++diff; 
     } 

     if(inComment==0){ 
      s[i-diff]=t[i]; 
     } 
     s[i-diff+1]='\0'; 
     ++i; 
    } 
    countS=i-diff; 
} 

Danke.

+0

Haben Sie einen Debugger die Ausführung des Programms zu verfolgen verwendet? Oder sogar grundlegende Printf Debugs? Lernen und Erfahrung im effektiven Debuggen ist die Mühe wert. – kaylum

+0

Muss ich einen Debugger installieren oder habe ich ihn bereits?Ich kodiere in IOs El Capitan mit TextWrangler. –

Antwort

0
while(i<=countS){ t[i]=s[i];... } 

Beachten Sie, dass Zeichenketten nullbasiert sind. Zum Beispiel "ABC" hat Länge 3, es beginnt bei Null Index, und der letzte gültige Index ist 2 (nicht 3). Deshalb sollten Sie den Zustand ändern i < string_length

while(i < countS){ t[i]=s[i];... } 

auch vorsichtig sein, wenn t[i+1] Zugriff, weil während i gültig ist, i+1 aus gebunden werden kann.

if (i < (countS - 1)) 
    if(t[i]=='/' && t[i+1]=='*') 

Um eine Zeichenkette zu einem anderen zu belegen, können Sie eine zweite variable k, einzuführen und k nach jedem Zuordnungs inkrementieren. Diese Methode ist einfacher (meiner Meinung nach) als die diff Variable zu verwenden und Additionen und Subtraktionen durchzuführen.

Zusätzlich statt char t[1000];, können Sie char *t = malloc(countS); eine temporäre Variable Länge countS zu erklären, dann hat es am Ende mit free(t) befreit werden. Wenn Ihr Compiler Array variabler Länge unterstützt, können Sie einfach char t[countS] setzen.

Beispiel:

char s[1000]; //Principal array 
int countS; //Number of char in array 

//Functions 1 
void deletMultiLineComments(void) 
{ 
    char *t = malloc(countS); 
    int i = 0; 
    int k = 0; 
    int inComment = 0; 

    while (i < countS) 
    { 
     t[i] = s[i]; 
     ++i; 
    } 

    i = 0; 
    while (i < countS) 
    { 
     if (i < countS - 1) 
     if (t[i] == '/' && t[i + 1] == '*') 
     { 
      inComment = 1; 
      i+=2; 
      continue; 
     } 

     if (inComment == 1) 
     { 
      if (i < countS - 1) 
      if (t[i] == '*' && t[i + 1] == '/') 
      { 
       inComment = 0; 
       i+=2; 
       continue; 
      } 
     } 

     if (inComment == 0) 
     { 
      s[k] = t[i]; 
      k++; 
     } 

     ++i; 
    } 

    free(t); 
    s[k] = '\0'; 
    countS = k; 

    printf("mulitline comment removed %s\n", s); 
} 

//Function 2 
void deletSingleLineComments(void) 
{ 
    char *t = malloc(countS); 
    int i = 0; 
    int k = 0; 
    int inComment = 0; 

    while (i < countS) 
    { 
     t[i] = s[i]; 
     ++i; 
    } 

    i = 0; 
    while (i < countS) 
    { 
     if (i < countS - 1) 
      if (t[i] == '/' && t[i + 1] == '/') 
      { 
       inComment = 1; 
       i += 2; 
       continue; 
      } 

     if (t[i] == '\n') 
     { 
      inComment = 0; 
     } 

     if (inComment == 0) 
     { 
      s[k] = t[i]; 
      k++; 
     } 

     i++; 
    } 
    free(t);  
    s[k] = '\0'; 
    countS = k; 

    printf("single comment removed %s\n", s); 
} 

int main(void) 
{ 
    //get input 
    scanf("%s", s); 

    countS = 0; 
    while (s[countS]) countS++; 

    deletMultiLineComments(); //Function 1 
    deletSingleLineComments(); //Function 2 
}