//
// main.c
// js
//
// Created by xxx on 17/9/15.
// Copyright © 2017年 xxx. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//处理内结构
void printf_inner(char *s)
{
int len = strlen(s);
int i = 0;
int flag_em = 0;
int flag_link = 0;
int flag_href = 0;
char link[101];
char href[101];
int link_pos = 0, href_pos = 0;
for(i = 0; i < len; i++)
{
switch(s[i])
{
case '_':
{
if(flag_link == 0 && flag_href == 0)
{
if(flag_em == 0)
{
printf("<em>");
flag_em = 1;
}
else
{
printf("</em>");
flag_em = 0;
}
break;
}
else
{
if(flag_link)
{
link[link_pos++] = s[i];
}
else if(flag_href)
{
href[href_pos++] = s[i];
}
break;
}
}
case '[':
{
link_pos = 0;
flag_link = 1;
break;
}
case ']':
{
link[link_pos] = '\0';
flag_link = 0;
break;
}
case '(':
{
href_pos = 0;
flag_href = 1;
break;
}
case ')':
{
href[href_pos] = '\0';
flag_href = 0;
printf("<a href=\"");
printf_inner(href);
printf("\">");
printf_inner(link);
printf("</a>");
break;
}
default:
{
if(flag_link)
{
link[link_pos++] = s[i];
}
else if(flag_href)
{
href[href_pos++] = s[i];
}
else
{
putchar(s[i]);
}
}
}
}
}
int main(void)
{
char buf[101];
char* p = NULL;
//用于标志段落
int flag_p = 0;
//无序列表
int flag_ul = 0;
int sharp_num = 0;
while(fgets(buf, 101, stdin))
{
if(strcmp(buf, "\n") == 0)
{
sharp_num = 0;
if(flag_p == 1)
{
printf("</p>\n");
flag_p = 0;
}
if(flag_ul == 1)
{
printf("</ul>\n");
flag_ul = 0;
}
continue;
}
else
{
if(buf[strlen(buf)-1] == '\n')
{
buf[strlen(buf)-1] = '\0';
}
switch(buf[0])
{
//标题
case '#':
{
int t = 0;
p = buf;
for(t = 0; t < 7; t++)
{
if(*(p+t) != '#')
{
break;
}
sharp_num++;
}
printf("<h%c>", sharp_num+'0');
while(*(p+t) == ' ')
{
t++;
}
printf_inner(p+t);
printf("</h%c>\n", sharp_num+'0');
break;
}
case '*':
{
p = buf;
if(flag_ul == 0)
{
flag_ul = 1;
printf("<ul>\n");
int t = 1;
while(*(p+t) == ' ')
{
t++;
}
printf("<li>");
printf_inner(p+t);
printf("</li>\n");
}
else
{
int t = 1;
while(*(p+t) == ' ')
{
t++;
}
printf("<li>");
printf_inner(p+t);
printf("</li>\n");
}
break;
}
default:
{
if(flag_p == 0)
{
flag_p = 1;
printf("<p>");
printf_inner(buf);
break;
}
else if (flag_p == 1)
{
printf("\n");
printf_inner(buf);
}
break;
}
}
}
}
if(flag_p)
{
printf("</p>");
}
if(flag_ul)
{
printf("</ul>");
}
return 0;
}
外结构直接分类就可以做出来,但是对于内结构,关键在于递归打印。
附上通过截图