You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C++中调用md4c库传递C风格字符串时解析异常求助

问题:md4c库Markdown转HTML输出异常

我尝试在C++程序中集成md4c库实现Markdown转HTML功能,按照文档调用md_html()函数,但输出结果异常:输入的Markdown内容每个标签里都包含了整个文档的内容。

我的代码

#include <stdio.h>
#include <string>
#include <fstream>
#include <sstream>

#include "Libs/md4c-html.h"

#define MD4C_USE_UTF8

void SaveTextToFile(const MD_CHAR* text, MD_SIZE size, void* unneeded)
{
    std::string fileUrl = "../../outputfile.html";

    std::ofstream file;
    file.open(fileUrl, std::ios_base::app);
    file << text;
    file.close();

    text = 0;
}


int main()
{
    std::ifstream file;
    file.open("../../inputfile.md");

    std::stringstream buffer;
    buffer << file.rdbuf();

    file.close();

    std::string text = buffer.str();
    int length = text.length();

    int endCode = md_html(text.c_str(), length, SaveTextToFile, NULL, 0, 1);
    printf("program finished with code %i\n", endCode);
}

输入与输出

输入Markdown:

# header1
paragraph

输出HTML:

<h1>header1
paragraph
</h1>
<p>paragraph
</p>

错误分析与修正

问题出在回调函数SaveTextToFile的实现上:

  • 未按指定长度输出内容:md4c传入的text是分段的二进制缓冲区,并非以\0结尾的C风格字符串,直接用file << text会读取到内存中第一个\0为止,导致超出当前分段范围,把后续内容也写入到当前标签里。
  • 频繁打开关闭文件:每次回调都打开关闭文件,虽不是直接错误原因,但会降低效率。

修正后的回调函数(推荐写法)

void SaveTextToFile(const MD_CHAR* text, MD_SIZE size, void* unneeded)
{
    static std::ofstream file("../../outputfile.html"); // 仅初始化一次,自动覆盖旧文件
    if (file.is_open()) {
        // 按指定长度写入当前分段内容
        file.write(text, size);
    }
}

若需要每次运行前清空文件的写法

int main()
{
    // 先清空输出文件
    std::ofstream clearFile("../../outputfile.html", std::ios_base::trunc);
    clearFile.close();

    // 读取输入文件
    std::ifstream file("../../inputfile.md");
    std::stringstream buffer;
    buffer << file.rdbuf();
    file.close();

    std::string text = buffer.str();
    int length = text.length();

    int endCode = md_html(text.c_str(), length, SaveTextToFile, NULL, 0, 1);
    printf("program finished with code %i\n", endCode);
}

void SaveTextToFile(const MD_CHAR* text, MD_SIZE size, void* unneeded)
{
    std::ofstream file("../../outputfile.html", std::ios_base::app);
    if (file.is_open()) {
        file.write(text, size);
    }
    file.close();
}

核心修正点是使用file.write(text, size)替代file << text,确保只写入当前分段的指定长度内容,避免读取缓冲区外的多余数据。

内容的提问来源于stack exchange,提问作者DressOrc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:03:25