我有一个命令行的源代码C game
,等待用户stdin
和输出stdout
.我想从文本字段输入main
到此C
代码的输入,并在文本区域字段中输出例如.
int mainer(int argc, char **argv) {
int i;
int hitme;
char ch;
prelim();
if (argc > 1) { // look for -f option
if (strcmp(argv[1], "-f")== 0) {
coordfixed = 1;
argc--;
argv++;
}
}
if (argc > 1) {
fromcommandline = 1;
line[0] = '\0';
while (--argc > 0) {
strcat(line, *(++argv));
strcat(line, " ");
}
}
else fromcommandline = 0;
// some other code
}
Run Code Online (Sandbox Code Playgroud)
从 …
我发现以下代码编译和工作:
func foo(p:UnsafePointer<UInt8>) {
var p = p
for p; p.memory != 0; p++ {
print(String(format:"%2X", p.memory))
}
}
let str:String = "??"
foo(str)
Run Code Online (Sandbox Code Playgroud)
这打印E4BB8AE697A5
,这是一个有效的UTF8表示??
据我所知,这是无证行为.来自文件:
当函数声明为采用UnsafePointer参数时,它可以接受以下任何一种:
- nil,作为空指针传递
- UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要时转换为UnsafePointer
- 一个输入输出表达式,其操作数是类型为Type的左值,它作为左值的地址传递
- 一个[Type]值,作为指向数组开头的指针传递,并在调用期间延长生命周期
在这种情况下,str
不属于他们.
我错过了什么吗?
添加:
如果参数类型是,则它不起作用 UnsafePointer<UInt16>
func foo(p:UnsafePointer<UInt16>) {
var p = p
for p; p.memory != 0; p++ {
print(String(format:"%4X", p.memory))
}
}
let str:String = "??"
foo(str)
// ^ 'String' is not convertible to 'UnsafePointer<UInt16>'
Run Code Online (Sandbox Code Playgroud)
即使内部String
表示是UTF16
let str = "??" …
Run Code Online (Sandbox Code Playgroud) 我在Swift 3上,我需要与一个C API进行交互,它接受一个以NULL结尾的字符串列表,例如
const char *cmd[] = {"name1", "value1", NULL};
command(cmd);
Run Code Online (Sandbox Code Playgroud)
在Swift中,API被导入为
func command(_ args: UnsafeMutablePointer<UnsafePointer<Int8>?>!)
Run Code Online (Sandbox Code Playgroud)
在尝试使用类型转换数百次后,unsafeAddress(of:)
我仍然无法完成这项工作.即使我传递了一个通过编译的有效指针,它也会在运行时崩溃,说无效的内存访问(在strlen函数中).或者也许这是关于ARC的事情?
let array = ["name1", "value1", nil]
// ???
// args: UnsafeMutablePointer<UnsafePointer<Int8>?>
command(args)
Run Code Online (Sandbox Code Playgroud)