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'
- 如何获取b'first second'?
- 因为我对 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++ 包装而言并非如此) .然而,它们的好处在于它们经过测试,因此您可以有理由相信它们是正确的。
出于学习目的,我尝试在 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'
- 如何获取b'first second'?
- 因为我对 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++ 包装而言并非如此) .然而,它们的好处在于它们经过测试,因此您可以有理由相信它们是正确的。