2016-06-30 3 views
0

Ich schreibe ein Programm, das den Kommentar eines Benutzers nimmt. Speziell eine, die außerhalb von /* und */ und auch innerhalb eingegeben hat. Ich habe meine Schleife geschrieben, um die Char "/" in meinem Array zu finden, und ich bin mir nicht sicher, wie man es und alles dazwischen entfernen kann, bis es wieder erscheint. Zum Beispiel, wenn meine Eingabe war "comment /* this is my comment */" Ich muss die /**/ und Inhalt zwischen entfernen. Meine Ausgabe wäre also einfach "comment". Wenn es keine "/* and */" gibt, wird nichts entfernt. Ich weiß, ich brauche eine Schleife, aber wie würde ich eine Schleife schreiben, die Zeichen im Array entfernt, bis die nächste "/" erscheint und entfernt es auch? Mein Code ist wie folgt:C Zeiger arithmetisches Array Zeichen entfernen

#include <stdio.h> 
#include <string.h> 

void remove_comment(char *s1, char *s2){ 

    for(; *s1 != '\0'; s1++){ //loops through array until null value 
    if(*s1 == '/'){ //if array has '/' stored 
        //clear array elements till next '/' and removes it as well 
    } 
    else{ 
    return; //do nothing to array 
    } 
    strcpy(s2,s1); //copies new modified string to s2 for later use 
} 

int main(){ 

    char s1[101]; //declares arrays up to 100 in length with room for null character 
    char s2[101]; 

    printf("Enter a comment: "); //enter a comment 
    fgets(s1, 100, stdin); // saves comment to array 

    remove_comment(s1,s2); //calls function 

    printf("%s", s2); //prints my modified array 

    return 0; 
} 
+1

Sie müssen nur die Start- und Endpositionen des Kommentars finden, dann String und verketten diese Positionen mit –

+0

Es könnte ein Detail sein, aber Sie Ihre Eingabe mit scanf Lesung() wird alles ignorieren, die folgen erste Leerzeichen (siehe http: // stackoverflow.com/questions/1247989/how-do-Sie-erlauben-Räume-zu-eingegeben-using-scanf) – Christophe

+0

@Christophe Danke, seit der Zeit der Veröffentlichung habe ich in 'fgets()' –

Antwort

1

Ihr Code se ems, um auf einer Schleife zu bauen, die die Zeichen der Schnur erforscht. Ich schlage vor, Ihnen daher folgende Lösung:

void remove_comment(char *s1, char *s2) 
{ 
    for(int in_comment=0; *s1 ; s1++){ //loops through array until null value 
     if(!in_comment && *s1 == '/' && s1[1]=='*') { //if array has '/' follewed by '*' stored 
      in_comment=1; // we enter a comment area 
      s1++; 
     } 
     else if (in_comment) {  // if we are in a comment area 
      if (*s1=='*' && s1[1]=='/') { // we only look for end of comment 
       in_comment = 0; 
       s1++; 
      } 
     } 
     else *s2++=*s1;  // if we're not in comment, in all other cases we just copy current char 
    } 
    *s2='\0'; // don't forget to end the string. 
} 

Es verwendet eine in_comment Variable zu sagen, ob wir derzeit Zeichen im Kommentar zu erkunden (und die Suche nach einem Ende Kommentar) oder nicht (und suchen schließlich für einen Start von Kommentar).

Es verwendet *s1 und s1[1], um auf das aktuelle und das nächste Zeichen zuzugreifen.

Die ursprüngliche Zeichenfolge bleibt unverändert.

Online demo

+0

Ich versuchte, weg von der Verwendung von Array [] in meiner Funktion und mit Zeigern lieber. Ich hätte das erklären sollen. Mir ist klar, dass Kommentare nicht in C funktionieren, sondern nur eine Eingabezeile des Benutzers. –

+0

Ich sehe ein Problem, wenn '"/* "' erscheint, aber kein '" */"' – chux

+0

@chux das '/ * /' wird als ein Anfang des Kommentars interpretiert und der Rest der Zeichenfolge wird ignoriert, wenn es gibt kein Ende des Kommentars. '/ ** /' wird sicher ignoriert. Sie können dies alles in der Online-Demo testen, indem Sie den Eingabe-String changieren – Christophe

1

Ich weiß, ich brauche eine Schleife

Könnte eine Schleife verwenden oder Standardbibliothek Funktionen nutzen. Betrachten Sie char *strstr(const char *s1, const char *s2); als einen möglichen Teil einer Lösung.

Die strstr Funktion lokalisiert das erste Auftreten in der Zeichenfolge durch s1 der Folge von Zeichen darauf (mit Ausnahme der abschließenden Null-Zeichen) in der Zeichenfolge von s2 spitz.

Die Funktion strstr gibt einen Zeiger auf die gefundene Zeichenfolge oder einen Nullzeiger zurück, wenn die Zeichenfolge nicht gefunden wird.

Einige nicht getestete Code, um Ihnen eine Idee zu geben.

void remove_comment(const char *src, char *dest){ 
    char *start = strstr(str, "/*");  // Look for beginning 
    if (start) {       // Find the beginning? 
    char *end = strstr(start + 2, "*/"); // Now search 2 past 
    if (end) {       // Find the end? 
     memcpy(dest, src, start - src); 
     strcpy(&dest[start - src], end+2); 
     return; 
    } 
    } 
    strcpy(dest, src); 
} 

Wenn Sie Bibliothek funcitons vermeiden wollen, werde ich entlang einer Spur passieren

// if(*s1 == '/'){ 
if(s1[0] == '/' && s1[1] == '*') { 

Natürlich ist diese wie für die Suche nach /* */ Kommentare in C-Code nicht ausreichend ist:

puts("/* this is not a C comment, but a string literal */"); 
int a = '/*', b = '*/'; 
// start of comment /* xyz */ 
+0

Nice Verwendung von' strstr() ';-) – Christophe