当前位置: 首页 > 面试题库 >

cgo-如何将字符串转换为C固定的char数组

梁巴英
2023-03-14
问题内容

我正在尝试在Go代码中实例化C结构。该结构的定义如下(在我无法修改的外部库中):

typedef struct {
    char field1[256];
} S1

在执行过程中,我这样做:

func myfunc(mystr string){
    // We need to convert mystr from string to char array
    cStr := C.CString(mystr)
    defer C.free(unsafe.Pointer(cStr)

    // Should work now
    s1 := &C.S1{field1: cStr}

    // Do something with s1...
}

但是它不能编译,因为:

字段值中不能使用cStr(类型* C.char)作为类型[256] C.char

我试过强制([256] C.char)(cStr),但显然也不起作用。

有没有办法实现我想做的事情?


问题答案:

最简单的解决方案是将结构的字段定义更改为char-pointer,这对于C语言中的字符串是非常标准的:

typedef struct {
    char *field1;
} S1

更复杂的解决方案是[1]:

arr := [256]C.char{}

for i := 0; i < len(mystr) && i < 255; i++ { // leave element 256 at zero
    arr[i] = C.char(mystr[i])
}

s1 := &C.S1{field1: arr}

[1]未经测试的代码,无法在此工作站上编译。



 类似资料:
  • 问题内容: 我有一个char数组: 我目前的解决方案是 但是肯定有更好的方法吗? 问题答案: 不,该解决方案是绝对正确的,而且非常少。 但是请注意,这是一种非常不寻常的情况:因为是在Java中专门处理的,所以实际上甚至是一个。因此,在普通代码中不需要将拆分为单个s并将其重新连接。 将此与C / C 进行比较,在C / C 中,你的捆绑在一侧和另一侧以零字节结尾,并且由于传统方法而在它们之间进行了许

  • 问题内容: 是否存在将“ \ uFFFF”之类的字符串转换为字符的标准方法,即六个字符的字符串包含一个Unicode字符的表示形式? 问题答案: 该值直接解释为所需的字符串,整个序列实现为单个字符。 换句话说,如果要对值进行硬编码: 请注意,这似乎不是适当的Unicode字符,但请尝试使用例如。 在此处阅读有关Unicode转义的信息

  • 我已经扫描ABCDEFGHIJK与fscanf成一个char数组[26]。然后我得到了ABCDEFGHIJK使用for进入另一个数组[11]。现在我需要一个ABCDEFGHIJK. mp4数组[15],以便将该文件名输入重命名函数。 除了printf、scanf之外,我对C编程知之甚少。 上面的代码似乎有效,但我想知道是否有更简单的方法(特别是对于更大的阵列)? 澄清:我有一个txt文件,格式是包

  • 问题内容: 我正在寻找一种将包含字符转义序列的字符串转换为表示的字符的方法。 因此,例如,我想将字符串(具有两个字符,一个反斜杠和一个双引号)解析为char 。因此,将一个字符数组转换为一个字符。 因此,可能会执行以下操作,反之亦然: 我不敢相信java.lang或其他任何东西都不能为此提供良好的代码(也许是本地代码),因为我觉得上面的代码可能不完整,并且无法解析每个有问题的(可逃避的?)字符,因

  • 问题内容: 我想通过CGO将Go字符串复制到char *中。 我可以这样做吗? 问题答案: 根据cgo文档,您需要使用C.CString函数将Go字符串转换为C字符串: 请注意,C.CString函数为您分配了内存,但不会释放它,因此您有责任通过如下调用来释放内存:

  • 问题内容: 我有一个Swift程序,可以与C库互操作。这个C库返回一个内部带有数组的结构,如下所示: 该定义已正确导入到Swift中。但是,该字段被解释为8个元素(类型为)的 元组 ,我不知道如何使用Swift 将其转换为a 。 没有可以接受元组的初始化程序,并且似乎不可能获得指向元组的第一个元素的指针(因为类型可以是异构的,这并不奇怪)。 现在,我最好的主意是创建一个微型C函数,该函数接受指向结