要求实现简易的Markdown到Html格式的转换。

主要就是字符串处理。以空行划分各个区块,区块内部字符的输出用一个\(print\_buf\)实现,至于强调和超链接的嵌套,则可以递归实现。

注意用scanf % ^\n & getchar实现,输入空行的时候,这个函数匹配不到字符,是不起作用的。也就是说,\(buf[]\)保持原样,不会变成"",buf[0]也不会是'\0'。所以判断空行需要从scanf的返回值入手。scanf返回值是成功匹配的个数,所以空行时它的返回值是0,非空时返回值为1,输入结束时返回值为-1(EOF)。

有空行的情况或者输入庞大的时候,可以使用fgets buf buf_sz stdin函数。这个函数会把换行符也读入字符串中,所以判断空行只需判断buf[0]是否是'\n'即可。后续字符串处理的时候还是把'\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;
}

最新文章

  1. iterator接口
  2. 【转】MongoDB C# / .NET Driver 中IMongoQuery的内部实现Query的用法
  3. HD1712ACboy needs your help(纯裸分组背包)
  4. Hacker(五)----黑客专用通道---&gt;端口
  5. OpenStack ceilometer部署安装监控,计费数据抓取测试Ok
  6. HDU 2167 Pebbles
  7. XP下採用DirectShow採集摄像头
  8. 201521123095 《Java程序设计》第3周学习总结
  9. PhpStorm2017版激活方法、汉化方法以及界面配置
  10. mysql索引总结(转)
  11. [UE4]国际化,中英文切换
  12. 汇编 inc 和 dec 指令
  13. ADOX创建ACCESS 表时,几个附加属性
  14. 关于offsetTop的误解
  15. 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果
  16. 【转】关于gcc、glibc和binutils模块之间的关系
  17. c++builder 解压缩
  18. 我的Linux之路——虚拟机linux与主机之间的文件传送
  19. 关于输入框在谷歌浏览器 ie 浏览器中 黄色背景的去除
  20. hdu 3081(二分+并查集+最大流||二分图匹配)

热门文章

  1. Mac 下安装并配置 Tomcat
  2. 【Luogu P1265】公路修建
  3. tar文件归档
  4. 【Android - 自定义View】之自定义可下拉刷新或上拉加载的ListView
  5. 【JavaEE】之MyBatis逆向工程的使用
  6. block的本质
  7. springboot打印SQL及多环境配置
  8. 关于C语言中i++和++i的区别以及printf输出的一些问题。
  9. Codeforces Round #452 (Div. 2) A B C
  10. io流函数略解(java)[一]