我在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吗?
答案 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的数组。
所以它将是
char c[]={'H','E','L','L','O','\0');
在这里你创建了一些像chars数组的数组。这样做的协同方式是。
char c[][2]={"H","E","L","L","O"};
但在这种情况下,您必须在c[0]
中传递c[1]
或printf
。
另请注意,首先可以使用
来完成 char c[]="HELLO";
这是一个包含6个字符的数组,包含\0
。
再一次你也可以完成
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;
请记住更改功能的签名