如何将字符串从C传递给swift?

时间:2017-12-06 08:31:33

标签: c swift

我在swift中使用OpenSSL作为库。因为它在C中,我需要将一些数据从C语言传递回swift。数据是一个数组,但经过一些研究后我得知我无法将数组从C传递给swift。我能想到的一种方法是将数组更改为字符串,然后将字符串传递回swift。 在C中我写道:

char teststring()
{
    char c[]={"H","E","L","L","O"};
    printf(c);
    return c;
}

在Swift中我写道:

teststring()

结果是它只打印H。 我做错了什么?有一种更容易的方法将数组从C传递回Swift吗?

4 个答案:

答案 0 :(得分:4)

您可能想要更改

char c[]={"H","E","L","L","O"};

char c[]={'H','E','L','L','O','\0'};

char c[]="HELLO"; 

通过char c[]={"H","E","L","L","O"};声明了一个字符串数组,而不是一个字符数组。 字符串和字符之间存在差异。

双引号中的字符串文字表示一组字符。所以,“H”似乎代表你的单个字符,但在内部它包含一个带有'H'的附加字符和非常必要的'\0',它终止了C中的字符。这可能是你的原因在控制台上打印出H作为输出。

这是因为根据C11 standard - Section: 6.4.5 String literals说明,

  

字符串文字是用双引号括起来的零个或多个多字节字符的序列,如“xyz”中所示。 UTF-8字符串文字是相同的,除了以u8为前缀。宽字符串文字是相同的,除了前缀为字母L,u或U。

此外,部分:6.4.4.4字符常量表明,

  

整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如'x'。宽字符常量是相同的,除了以字母L,u或U作为前缀。稍后详述的一些例外,序列的元素是源字符集的任何成员;它们以实现定义的方式映射到执行字符集的成员。

此外,

char teststring()

表示teststring应该返回char,而您返回的c现在是一个字符串。所以要么改变它以返回指向char的指针,即

char* teststring()

或者,返回char,如return c[0];

答案 1 :(得分:1)

有几件事......

首先,以这种方式格式化字符串要容易得多:

GridBagConstraints

但是,如果你想按照自己的方式去做,你需要对字符串进行空终止,否则计算机将无法知道字符串结束的位置和新内存的开始:

urls.py

变为:

char* c="HELLO";

查看单引号与双引号?双引号表示整个字符串(null以零结尾)...单引号表示单个字符。

所以当你用双引号做的时候,内存中的字符整个看起来像这样:

H0E0L0L0O0

使用单引号,内存中的字符如下所示:

HELLO0

printf函数将打印,直到达到零然后退出。这就是为什么你只得到了' H'打印出来。

答案 2 :(得分:1)

是的,您必须声明char s的数组。

所以它将是

案例-1

char c[]={'H','E','L','L','O','\0');

在这里你创建了一些像chars数组的数组。这样做的协同方式是。

案例-2

char c[][2]={"H","E","L","L","O"};

但在这种情况下,您必须在c[0]中传递c[1]printf

另请注意,首先可以使用

来完成

案例-3

   char c[]="HELLO";

这是一个包含6个字符的数组,包含\0

再一次你也可以完成

案例-4

   char *c[]={"H","E","L","L","O"};

在此您必须传递c[0]c[1],这将打印字符串"H""E"

另请注意

char c[]={'H','E','L','L','O'};

是有效的初始化,但不是以null结尾。因此,您无法在预期存在空终止的char数组的位置传递它。 (如strlen()等)。

现在案例-2,这里的字符串是可修改的。所以你可以改变它们中的字符,因为case-4中的字符串不是。这些是不可修改的字符串文字。

  

简单地说,如果你想要一个包含那些字符串的字符串   然后Case-1和case-3就是你的方式。

答案 3 :(得分:0)

c是一个数组,当您返回c时,您将返回第一个元素。您需要返回整个数组。检查

printf("%s", c);
return *c;

请记住更改功能的签名