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

标签 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 ;
}

我和我的 friend 正在做一个 self 挑战项目,上面的代码是一个从“test.txt”文件中删除注释并将非注释部分写入temp.txt文件的程序。它仅适用于多评论(有意)。

我试图处理\n 字符以在注释内部和注释外部出现时创建新行。例如 line1\nline2 应在不同的行中导出。另外 line1/*comm\nent*/line2 也应该在不同的行中导出(写入)。但是,如果转义字符出现在字符串或字 rune 本中,则应将其视为普通字符串或字符。

最佳答案

a program that removes comment(s)

代码需要一种新的方法来稳健地处理诸如 "\"""\'"'\"''\''//'/* "*/"//"

一般来说,至少有 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// 的操作,所有的赌注都会被取消。

关于c - 我该如何处理下面代码中的\n(换行符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54855204/

相关文章:

c - 如何通过 $PATH 搜索

c - 尝试添加代码来计算两个用户输入点之间的距离

c - C中的中止陷阱6错误

c - OpenSSL 1.1.0 中的 EVP_get_cipherbyname 和 "undefined struct/union evp_cipher_st"

无法获取 libsodium 预构建库供 mingw windows 工作

c - C中的高效字符串连接

c - char 变量在不接受输入的情况下继续进行

c++ - 如何从用户空间设置hostapd的 "channel"和 "hw_mode"(c++应用程序)

c - 在 assembly 中使用定义

c - C 中的同步对象及其与数据结构结构的关联