嗯,这似乎很容易,但我在网上找不到一个参考.在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)
您不必将每个元素设置为长度为零的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)