2

我一直在尝试为Upskirt制作 Python 扩展。我认为第一个 C 项目不会太难,因为有示例(Upskirt 代码中的示例程序和 Ruby 扩展)。

扩展有效,它转换了我扔给它的 Markdown,但有时输出在字符串末尾有一些垃圾。而且我不知道是什么原因造成的。

这是一些输出:

python test.py 
<module 'pantyshot' from '/home/frank/Code/pantyshot/virtenv/lib/python2.7/site-packages/pantyshot.so'>
<built-in function render>

'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>

--------------------------------------------------------------------------------

'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>

--------------------------------------------------------------------------------

我的代码可以在我的 Github repo中找到。我称它为 pantyshot,因为当我听到超短裙时我想到了这个。奇怪的名字,我知道。

我希望有一个人可以帮助我。

4

1 回答 1

3

你正在做strdup一个pantyshot_render

output_text = strdup(ob->data); /* ob is a "struct buf *" */

但我不认为ob->data是一个以空结尾的 C 字符串。你会在里面找到这个upskirt/buffer.c

/* bufnullterm • NUL-termination of the string array (making a C-string) */
void
bufnullterm(struct buf *buf) {
    if (!buf || !buf->unit) return;
    if (buf->size < buf->asize && buf->data[buf->size] == 0) return;
    if (bufgrow(buf, buf->size + 1))
        buf->data[buf->size] = 0; }

因此,您可能会跑出缓冲区的尽头,并'\0'在造成任何伤害之前通过击中 a 来幸运。我认为你应该bufnullterm(ob)在复制ob->data为 C 字符串之前调用;或者您可以查看ob->size、使用mallocstrncpy复制它,并手动处理 nul 终止符(但请确保ob->size + 1为复制的字符串分配字节)。

而且,如果您想摆脱换行符(即尾随\n),那么您可能必须在某处手动进行一些空格剥离。

于 2011-04-29T18:30:01.780 回答