strncat 在 cython 中的使用

strncat use in cython

出于学习目的,我尝试在 class.[=] 中的 cython 中使用 strncat 13=]

我愿意:

from libc.stdlib cimport free

cdef extern from "<string.h>":
    char *strncat(char *pto, const char **pfrom, size_t_size)
    size_t strlen   (const char *s)

cdef class test:
    cdef:
        char *palabra
        #size_t len_palabra
    
    def __cinit__(self, char *Palabra):
        self.palabra = Palabra
    
    cdef append_palabra(self, char *other_palabra):
        strncat(self.palabra, &other_palabra, strlen(other_palabra))
        print(other_palabra)
           
    def manipulate_palabra(self, char *other_palabra):
        self.append_palabra(other_palabra)
        print(self.palabra)
        
    def __dealloc__(self):
        free(self.palabra)
    
        
a = test(b'first ')
a.manipulate_palabra(b'second')

打印语句抛出:

b'second'
b'first H\xc3-\xcd\xa9\x7f'
  1. 如何获取b'first second'?
  2. 因为我对 Cython 几乎是文盲,所以我特意提出整个 class 来听取批评和评论。

谢谢!

您的问题是您定义了:

char *strncat(char *pto, const char **pfrom, size_t_size)

但实际签名是

char *strncat(char *pto, const char *pfrom, size_t_size)

我怀疑这至少应该在 C 编译阶段产生警告,值得认真对待。

Cython 确实包装了大部分 C 标准库,因此最简单的解决方案是

from libc.string cimport strncat, stolen

Cython 包装没有什么神奇之处 - 它们是为了方便而提供的,但不会做任何您不能自己编写的事情(至少对于 C,对于 C++ 包装而言并非如此) .然而,它们的好处在于它们经过测试,因此您可以有理由相信它们是正确的。