2013-07-07 49 views
7

有以下假設代碼:快速字符串數組 - 用Cython

cdef extern from "string.h": 
    int strcmp(char* str1, char* str2) 

def foo(list_str1, list_str2): 
    cdef unsigned int i, j 
    c_arr1 = ?? 
    c_arr2 = ?? 
    for i in xrange(len(list_str1)): 
     for j in xrange(len(list_str2)): 
      if not strcmp(c_arr1[i], c_arr2[j]): 
       do some funny stuff 

是有一些方法如何將列表轉換爲C數組?

我已閱讀並嘗試過Cython - converting list of strings to char **但這隻會引發錯誤。

回答

9

請嘗試下面的代碼。 to_cstring_array函數在下面的代碼中就是你想要的。

from libc.stdlib cimport malloc, free 
from libc.string cimport strcmp 
from cpython.string cimport PyString_AsString 

cdef char ** to_cstring_array(list_str): 
    cdef char **ret = <char **>malloc(len(list_str) * sizeof(char *)) 
    for i in xrange(len(list_str)): 
     ret[i] = PyString_AsString(list_str[i]) 
    return ret 

def foo(list_str1, list_str2): 
    cdef unsigned int i, j 
    cdef char **c_arr1 = to_cstring_array(list_str1) 
    cdef char **c_arr2 = to_cstring_array(list_str2) 

    for i in xrange(len(list_str1)): 
     for j in xrange(len(list_str2)): 
      if i != j and strcmp(c_arr1[i], c_arr2[j]) == 0: 
       print i, j, list_str1[i] 
    free(c_arr1) 
    free(c_arr2) 

foo(['hello', 'python', 'world'], ['python', 'rules']) 
+0

那麼這是一個很棒的答案!非常感謝,但現在是,行ret [i] = PyString_AsString(list_str [i])引發編譯期間從臨時Python值中獲取char * – Jendas

+0

好吧,我的壞!我忘記了從cpython.string cimport PyString_AsString。現在它工作得很好!謝謝!! – Jendas