我正在使用TidyHtml在Linux环境中清理我的应用程序中的html文件。我确实意识到libtidy是一个C库。我确实将它包含在extern" C" {}语法中,如我的代码中所示。这是我改编的TidyHtml网站在C ++示例中使用的示例,我在条件中添加了printf()函数。
有两个问题。第一个以tidyOptSetBool()
开头但失败并且永远不会到达printf("%s\n", "1");
行。第二个是
tidyBufFree( &output );
tidyBufFree( &errbuf );
行导致分段错误(核心转储)。
这是完整的代码示例:
#include <stdio.h>
#include <tidy.h>
#include <tidybuffio.h>
#include <stdio.h>
#include <errno.h>
using namespace std;
extern "C" {
int tidyHtml(){
const char* input = "<title>Foo</title><p>Foo!";
TidyBuffer output = {0};
TidyBuffer errbuf = {0};
int rc = -1;
Bool ok;
TidyDoc tdoc = tidyCreate(); // Initialize "document"
printf( "Tidying:\t%s\n", input );
ok = tidyOptSetBool( tdoc, TidyXhtmlOut, yes ); // Convert to XHTML
if ( ok ){
rc = tidySetErrorBuffer( tdoc, &errbuf ); // Capture diagnostics
printf("%s\n", "1");
}
if ( rc >= 0 ){
rc = tidyParseString( tdoc, input ); // Parse the input
printf("%s\n", "2");
}
if ( rc >= 0 ){
rc = tidyCleanAndRepair( tdoc ); // Tidy it up!
printf("%s\n", "3");
}
if ( rc >= 0 ){
rc = tidyRunDiagnostics( tdoc ); // Kvetch
printf("%s\n", "4");
}
if ( rc > 1 ){ // If error, force output.
rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
printf("%s\n", "5");
}
if ( rc >= 0 ){
rc = tidySaveBuffer( tdoc, &output ); // Pretty Print
printf("%s\n", "6");
}
if ( rc >= 0 )
{
if ( rc > 0 )
printf( "\nDiagnostics:\n\n%s", errbuf.bp );
printf( "\nAnd here is the result:\n\n%s", output.bp );
}
else
printf( "A severe error (%d) occurred.\n", rc );
tidyBufFree( &output );
tidyBufFree( &errbuf );
tidyRelease( tdoc );
return rc;
}
}
int main(int argc, char *argv[]){
tidyHtml();
}
这是我的complie语句g++ -o main main2.cpp -ltidy
,它报告了0个错误。
并在运行应用程序时输出:
Tidying: <title>Foo</title><p>Foo!
A severe error (-1) occurred.
Segmentation fault (core dumped)