문제 201703-3 마크 다운에 CCF-CSP 솔루션

마크 다운은 간단한 포맷 변환 HTML을 달성하는 데 필요한.

주로 문자열 처리. 기호가있는 문자의 내부 출력 블록을 분할 된 각 블록에 빈 라인 (\ 인쇄 \의 _buf의 \) , 달성 스트레스로 중첩 된 하이퍼 링크는, 순환 적으로 구현 될 수있다.

scanf와의 %로 ^ n 개의 &이 기능은 문자와 일치하지 않을 때 달성 getchar가 빈 줄을 입력, 작동하지 않는 \합니다. 즉, \ (BUF [] \) [0] '\ 0'을하지 않습니다 buf를 그대로 ","이되지 않습니다. 따라서, 빈 줄은 scanf와의 리턴 값을 시작 할 필요가 결정된다. scanf와 리턴 값 성공 일치의 숫자이므로, 그것은 널이 아닌 값을 반환하고, 빈 행 값이 0 반환, 반환 값은 -1 입력의 끝 (EOF).

가능한 경우 라인 또는 당신은 표준 입력 기능 buf_sz buf를하고는 fgets를 사용하여, 거대한를 입력합니다. 또한 개행 문자열을 읽을이 기능은, 빈 라인 만 [0]인지 '\ n을'buf를 판단 할 것으로 판단된다. 후속 처리가 문자열 인 경우 '\ N-' '대체'\ 0 '더 나은 것입니다.

#include <bits/stdc++.h>

using namespace std;

void print_buf(char buf[])
{
    for (int i = 0; buf[i] != '\0'; i++)
    {
        if (buf[i] == '_')
        {
            int j = i + 1;
            for (; buf[j] != '_'; j++);
            char tmp_buf[105];
            strcpy(tmp_buf, buf + i + 1);
            tmp_buf[j-i-1] = '\0';
            printf("<em>");
            print_buf(tmp_buf);
            printf("</em>");
            i = j;
        }
        else if (buf[i] == '[')
        {
            char text[105], link[105];
            int j = i + 1;
            for (; buf[j] != ']'; j++);
            strcpy(text, buf + i + 1);
            text[j-i-1] = '\0';
            i = j + 1;
            j = i + 1;
            for (; buf[j] != ')'; j++);
            strcpy(link, buf + i + 1);
            link[j-i-1] = '\0';
            printf("<a href=\"");
            print_buf(link);
            printf("\">");
            print_buf(text);
            printf("</a>");
            i = j;
        }
        else
        {
            printf("%c", buf[i]);
        }
    }
}

int main()
{
    char buf[105];
    int tmpblk = -1; // 0 p 1 h 2 ul
    while (fgets(buf, 105, stdin) != NULL)
    {
        if (buf[0] == '\n')
        {
            if (tmpblk == 2)
                printf("</ul>\n");
            else if (tmpblk == 0)
            {
                printf("</p>\n");
            }
            tmpblk = -1;
        }
        else
        {
            buf[strlen(buf)-1] = '\0';
            if (buf[0] == '#')
            {
                tmpblk = 1;
                int h_num = 0;
                int i = 0;
                for (; buf[i] == '#'; i++)
                    h_num++;
                for (; buf[i] == ' '; i++);
                printf("<h%d>", h_num);
                print_buf(buf + i);
                printf("</h%d>\n", h_num);
            }
            else if (buf[0] == '*')
            {
                if (tmpblk == 2)
                {
                    int i = 1;
                    for (; buf[i] == ' '; i++);
                    printf("<li>");
                    print_buf(buf + i);
                    printf("</li>\n");
                }
                else
                {
                    tmpblk = 2;
                    int i = 1;
                    for (; buf[i] == ' '; i++);
                    printf("<ul>\n");
                    printf("<li>");
                    print_buf(buf + i);
                    printf("</li>\n");
                }
            }
            else
            {
                if (tmpblk == 0)
                {
                    printf("\n");
                    print_buf(buf);
                }
                else
                {
                    tmpblk = 0;
                    printf("<p>");
                    print_buf(buf);
                }
            }
        }
    }

    if (tmpblk == 2)
        printf("</ul>\n");
    else if (tmpblk == 0)
    {
        printf("</p>\n");
    }

    return 0;
}

추천

출처www.cnblogs.com/acboyty/p/11372051.html