註釋轉換

將c語言的註釋轉換成c++的註釋

測試用例:
1.一般情況

/* int a = 0; */

2.連續*

/***/

3.換行問題

/* int b = 0; */ int c = 0;
/* aaa */
int d = 0;

4.匹配問題

/*AAA/*BBB*/
/*int e = 0;/*xxxxxx*/

5.多行註釋

/*
AAA
BBB
CCC
*/int aa;

6.連續註釋

/*aaa*//*bbb*/

7.c++註釋 (遇到c++註釋直接讀完一行)

// /**/

Annotation conversion.c

# include<stdio.h>
# include<stdlib.h>

enum Tag      
{
    C_BEGIN,
    C_END,
};

void Convert(const char* fIn,char* fOut)
{
    FILE* Input = fopen(fIn, "r");
    if (NULL == Input)
    {
        printf("打開文件%s失敗\n",fIn);
        return;
    }  
    FILE* Output = fopen(fOut, "w");
    if (NULL == Input)
    {
        printf("打開文件%s失敗\n", fOut);
        return;
    }

    Tag tag = C_END;
    char ch = fgetc(Input);
    char second;
    while (ch != EOF)
    {
        switch (ch)
            {
            case '/':
                fputc('/', Output);
                second = fgetc(Input);
                if (second == '*')
                {
                    //4.匹配問題
                    if (tag == C_END) 
                    {
                        fputc('/', Output);
                        tag = C_BEGIN;
                    }
                    else
                    {
                        fputc('*', Output);
                    }
                }
                else if (second == '/')     // 7. 碰到c++註釋,讀完一行
                {
                    fputc(second, Output);
                    char cur;
                    do
                    {
                        cur = fgetc(Input);
                        if (cur == EOF)
                        {
                            return;
                        }
                        fputc(cur, Output);
                    } while (cur != '\n');
                }
                else
                {
                    fputc(second, Output);
                }
                break;
            case '*':
                second = fgetc(Input);
                if (second == '/' && tag == C_BEGIN)   
                {  
                    //  3. 換行問題
                    char next = fgetc(Input);
                    if (next != '\n' && next != EOF)
                    {
                        fputc('\n', Output);
                        fseek(Input, -1, SEEK_CUR); //6.連續註釋  /**//**/
                    }
                    else
                    {
                        fputc(next, Output);
                    }
                    tag = C_END;
                }
                else                      //   2. /***/ 
                {
                    fputc('*', Output);
                    fseek(Input, -1, SEEK_CUR);
                }
                break;
            case '\n':
                fputc('\n', Output);
                // 5. 多行註釋
                if (tag == C_BEGIN)
                {
                    fputc('/', Output);
                    fputc('/', Output);
                }
                break;
            default:
                fputc(ch, Output);
        }
        ch = fgetc(Input);
    }
    fclose(Input);
    fclose(Output);
}

void Test()
{
    Convert("Input.cpp","Output.cpp");
}
int main()
{
    Test();
    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章