我一直在尝试为 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>
--------------------------------------------------------------------------------
我的代码可以在 my Github repo 中找到。我称之为 pantyshot,因为当我听到超短裙时我就想到了这个。我知道,这个名字很奇怪。
希望有人能帮助我。
最佳答案
你正在做strdup
in pantyshot_render
:
output_text = strdup(ob->data); /* ob is a "struct buf *" */
但我不认为 ob->data
是一个以 nul 结尾的 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'
。我认为你应该在将 ob->data
复制为 C 字符串之前调用 bufnullterm(ob)
;或者你可以看看ob->size
,使用 malloc
和 strncpy
复制它,并手动处理 nul 终止符(但请确保分配 ob->size + 1
字节用于复制的字符串)。
如果您想删除换行符(即尾随的 \n
),那么您可能需要在某处手动删除空格。
关于Upskirt 的 Python 扩展 : garbage at end of string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5835302/