P2395 BBCode转换Markdown 题解

· · 题解

这是一篇使用 C 语言的题解。

简要题意

思路

一道中模拟题。可比 P3695 什么的阳间多了。

他要什么你就怎么写就可以了。

首先是读入。

读入字符串的处理:

//给标签设置枚举类
typedef enum {
    H1, H2, B, I, URL, IMG, QUOTE
} Label;

//... ...

//判断标签。
//static inline 是优化用的
static inline Label judgeLabel() {
    if (*cursor == 'h') {
        cursor++;
        if (*cursor == '1') {
            cursor += 2;    //跳过后括号
            return H1;
        } else {
            cursor += 2;
            return H2;
        }
    } else if (*cursor == 'b') {
        cursor += 2;
        return B;
    } else if (*cursor == 'i') {
        if (*(cursor + 1) == 'm') {
            cursor += 4;
            return IMG;
        } else {
            cursor += 2;
            return I;
        }
    } else if (*cursor == 'u') {
        cursor += 4;
        return URL;
    }
    cursor += 6;
    return QUOTE;
}
bool is_end = false;    //存储这个标签是否是结束标志(是否有斜杠)
if (*cursor == '/') {
    cursor++;
    is_end = true;
}
Label now_label = judgeLabel();
if (!is_end) {
    labPush(now_label); //labPush、labPop 等为栈操作。函数就一行。具体见源代码。
} else {
    if (labEmpty()) {
        puts("Unclosed Mark");
        return 0;
    }
    if (labTop() != now_label) {
        puts("Match Error");
        return 0;
    }
    labPop();
}

之后处理各个标签。

//... ...

else if (now_label == QUOTE) {
    if (*cursor == '\n' && (*(ans_cursor - 1) == '\n' || ans_cursor == ans))
        cursor++;   //防止多换行:
                    //如果输出缓冲区的最后一个字符是换行而且紧接着[quote]光标读到的
                    //也是一个换行,那么就让光标后移,跳过换行。
    if (*(cursor - 1) != '\n') {  //判断 [quote] 前面是否没有换行
        //解决无换行quote第一行没有> 的问题
        if (*(ans_cursor - 1) != '\n')
            ansAppend('\n');    //如果 [quote] 两边都没有换行就加上一个换行。
        ansAppend('>');
        ansAppend(' ');
    }
    do {
        if (*cursor == '\n') {
            ansAppend('\n');    //解决最后一行换行多出> 的问题。
            cursor++;   //如果这个字符是换行,先把换行输出,之后去看看后面紧接着的是不是 [/quote]
                        //如果是就会在后面判断时 break 掉,不会输出 > 
        }
        if (*cursor == '[' && *(cursor + 1) == '/' && *(cursor + 2) == 'q' &&
            *(cursor + 3) == 'u' && *(cursor + 4) == 'o' && *(cursor + 5) == 't' &&
            *(cursor + 6) == 'e' && *(cursor + 7) == ']')
            break;
        if (*(cursor - 1) == '\n') {
            ansAppend('>');
            ansAppend(' ');
        }
        ansAppend(*cursor);

    } while (*(cursor++) != '\0');
    if (*cursor == '\0') {
        //整个输入读完了之后都没找到 [/quote]
        puts("Unclosed Mark");
        return 0;
    }
    cursor += 8;    //跳过标签
    if (*cursor == '\n' && *(ans_cursor - 1) == '\n')
        cursor++;   //防止多换行
    labPop();   //弹出栈中的quote
}

最后一点

海内存知己,天涯若比邻。请稍等...

祝你们成功(滑稽

点击此处查看源代码