Как я могу обработать \ n (символ новой строки) в коде ниже - PullRequest
0 голосов
/ 24 февраля 2019
#include<stdio.h>
#include <stdlib.h>
#include<stdbool.h>
int lines;
void m_cmnt(FILE *fp) 
{
    int prev = 0;
    int ch;
    while ((ch = getc(fp)) != EOF) 
    {
        if (prev == '*' && ch == '/') 
        {
            return;
        } 
        else 
        {
            prev = ch;
        }
    }
    fprintf(stderr, "error in line %d: unterminated comment\n", lines+1);
}

int main ( int c , char **arr )
{
    FILE *fp , *np ;
    int ch , prev ;
    lines = 0;
    bool String=0 ;

    fp = fopen("test.txt", "r") ;
    np = fopen("temp.txt" , "w") ;

    if (fp==NULL )
    {
        printf ("Invalid/No Filename given as Argument ! \n") ;
        return 1 ;
    }

    while ((ch=getc(fp))!=EOF )
    {
        if (ch == '\n')
            lines++;

        /* file pointer currently not inside a string */
        if ( !String )
        {
            if ( ch=='/' )
            {
                prev=ch ;
                ch= getc(fp) ;
                switch(ch)
                {
                    case '*'  : /*if(ch != 'a')
                                    putc('h', np);*/
                                m_cmnt( fp) ;
                                putc(' ', np);
                                 break ;
                    default   :
                                 putc(prev , np) ;
                                 putc(ch , np) ;
                                 break ;
                }
            }
            else putc( ch ,np ) ;
        }
        else  putc(ch , np) ;

        if ( ch=='\"' || ch=='\'')
            String = !String ;
        prev = ch ;

    }

    fclose(fp) ;
    lines++;
    printf("line = %d", lines);
    fclose(np) ;
    //remove(arr[1]) ;
    //rename( "temp.txt" , arr[1] ) ;
    return 0 ;
}

Мой друг и я работаем над проектом самостоятельного вызова, и приведенный выше код представляет собой программу, которая удаляет комментарий из файла «test.txt» и записывает часть без комментариев в файл temp.txt.Это работает только для нескольких комментариев (преднамеренно).

Я пытался обработать символ \ n, чтобы создать новую строку, когда это происходит внутри комментария и вне комментария.Например, line1\nline2 следует экспортировать в разные строки.Также line1/*comm\nent*/line2 также должно быть экспортировано (записано) в разных строках.Но если escape-символ встречается в строковом или символьном литерале, его следует рассматривать как обычную строку или символ.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

программа, которая удаляет комментарии

Код нуждается в новом подходе для надежной обработки регистра, например "\"", "\'", '\"', '\'', // ', /* " */, "//" и т. Д.

Как правило, у вас есть по крайней мере 5 состояний: Нормальное, в "" строке, в '' константе, в /* */ комментарии, в // eol комментарий.

Предлагаемый переработанный алгоритм.

// Pseudo code
while ((c=get()) != EOF) {
  if (c == ''') process_quote();  
  else if (c == '"') process_double_quote();
  else if (c == '/') {
    next = fgetc() 
    switch (next) {
      case '*': process_slash_star_comment();
      case '/': process_slash_slash_comment();
      default: unget(next); put('/');
  else put(c)
}

Все ставки выключены, если код выполняет что-то вроде #define x //.

0 голосов
/ 24 февраля 2019

Следующий код должен делать то, что вы хотите (не проверено / не проверено)

// TODO: includes

FILE *fp;

bool expect(int c) {
  int d = fgetc(fp);
  if (d == c) return true;
  fungetc(d, fp);
  return false;
}

// handle things differently while inside a string/char literal.
void quoted(int q) {
  while (true) {
    if (expect(q)) break; // found matching quote, leave the function
    // skip over character escape sequences
    // FIXME: does not handle multi-character escape sequences correctly
    if (expect('\\')) putchar('\\');
    putchar(fgetc(fp)); // NOTE: will also print character after '\\'
  }
}

// In response to the comment
bool escnl(void) {
  if (expect('\\')) {
    if (expect('n')) {
      putchar('\n'); // found \n!
      return true;
    }
    fungetc('\\', fp); // found backslash but not a \n
  }
  return false;
}

int main(void) {
  // TODO: initialization

  while (true) {
    if (expect('/')) {
      if (expect('*') { // found a comment!
        while (true) { // search for the end
          // if (expect('\n')) putchar('\n'); // emit newlines in comments, as requested // commented out as per answer comment
          if (expect('*') && expect('/')) break; // found the end!
          if (!escnl()) fgetc(fp);
        }
      }
      else putchar('/'); // found a slash, but wasn't a comment
    }
    else if (expect('\"')) quoted('\"');
    else if (expect('\'')) quoted('\'');
    else if (expect(EOF)) break;
    else if (!escnl()) putchar(fgetc(fp));
  }

  // TODO: cleanup

  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...