如何在没有循环的情况下在Cython中创建空的char数组

Eli*_*igo 5 c python cython

嗯,这似乎很容易,但我在网上找不到一个参考.在C中,我们可以创建一个空字符char数组,n如下所示:

char arr[n] = "";
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在Cython中做同样的事情时

cdef char arr[n] = ""
Run Code Online (Sandbox Code Playgroud)

我得到这个编译错误:

Error compiling Cython file:
------------------------------------------------------------
...
cdef char a[n] = ""
                   ^
------------------------------------------------------------

Syntax error in C variable declaration
Run Code Online (Sandbox Code Playgroud)

显然,Cython不允许以这种方式声明数组,但还有其他选择吗?我不想手动设置数组中的每个项目,也就是说我不是在寻找这样的东西

cdef char a[10]
for i in range(0, 10, 1):
    a[i] = b"\0"
Run Code Online (Sandbox Code Playgroud)

Stu*_*den 5

您不必将每个元素设置为长度为零的C字符串.只需将第一个元素归零就足够了:

cdef char arr[n]
arr[0] = 0
Run Code Online (Sandbox Code Playgroud)

接下来,如果要将整个char数组归零,请使用memset

from libc.string cimport memset
cdef char arr[n]
memset(arr, 0, n)
Run Code Online (Sandbox Code Playgroud)

如果C纯粹主义者抱怨0而不是'\ 0',请注意'\ 0'是Cython中的Python字符串(Python 3中的unicode).'\ 0'不是Cython中的C char!memset期望第二个参数的整数值,而不是Python字符串.

如果你真的想知道Cython中C'\ 0'的int值,你必须在C中编写一个辅助函数:

/* zerochar.h */
static int zerochar() 
{
    return '\0';
}
Run Code Online (Sandbox Code Playgroud)

现在:

cdef extern from "zerochar.h":
    int zerochar()

cdef char arr[n]
arr[0] = zerochar()
Run Code Online (Sandbox Code Playgroud)

要么

cdef extern from "zerochar.h":
    int zerochar()

from libc.string cimport memset
cdef char arr[n]
memset(arr, zerochar(), n)
Run Code Online (Sandbox Code Playgroud)