我如何在下面的代码中处理\ n(换行符)

时间:2019-02-24 18:40:23

标签: c

#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也应以不同的行导出(写入)。但是,如果转义字符出现在字符串或字符文字中,则应将其视为普通字符串或字符。

2 个答案:

答案 0 :(得分:1)

  

删除评论的程序

代码需要一种新的方法来健壮地处理"\"""\'"'\"''\''// '/* " */,{ {1}}等。

通常,您至少有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) } 的事情。

答案 1 :(得分:0)

以下代码应做您想要的(未经测试/未经检查)

// 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;
}