Upskirt 的 Python 扩展 : garbage at end of string

标签 python c python-extensions

我一直在尝试为 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 ,使用 mallocstrncpy 复制它,并手动处理 nul 终止符(但请确保分配 ob->size + 1 字节用于复制的字符串)。

如果您想删除换行符(即尾随的 \n),那么您可能需要在某处手动删除空格。

关于Upskirt 的 Python 扩展 : garbage at end of string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5835302/

相关文章:

python - 我可以使用 SQL 将存储为 CSV(逗号分隔值)的表列的内容拆分为新表中的各个行吗?

c - 错误的文件描述符。为什么?

python - Py_BuildValue : make tuple with bool?

macos - mac os x 上的 Cmake,使用完整路径链接库

python - 包含和分发具有 Python C 扩展的第三方库

python - 将 git 克隆到虚拟 Python 环境的推荐工作流程

python - 如何在 python 中使用 os.system() 来运行 shell 命令

python - 在 Linux 上忽略 glob() 中的大小写

c - 多个 printf 不起作用错误 6

c - 为什么从 bash 脚本调用超时程序会导致 tcsetattr 挂起?