我正试图弄清楚如何从D字符串(不可变(char)[])获取一个普通的,可变的C字符串(char*)到我可以将字符数据传递给遗留C代码.toStringz不起作用,因为我得到一个错误,说我"不能隐式地将类型为immutable(char)*的表达式(toStringz(this.fileName())转换为char*".我是否需要重新创建一个新的,可变的char数组并将字符复制过来?
ken*_*ytm 13
如果您可以更改旧C代码的D接口的标头,并且您确定旧C代码不会修改字符串,则可以使其接受a const(char)*,例如
char* strncpy(char* dest, const(char)* src, size_t count);
// ^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
是的,它不漂亮,因为结果是不可改变的.
这就是为什么我总是在我的代码中返回新数组的可变副本.让它们变成永恒是没有意义的.
解决方案:
你可以做到
char[] buffer = (myString ~ '\0').dup; //Concatenate a null terminator, then dup
Run Code Online (Sandbox Code Playgroud)
然后buffer.ptr用作指针.
这浪费了一个字符串.更好的方法可能是:
char[] buffer = myString.dup;
buffer ~= '\0'; //Hopefully this doesn't reallocate
Run Code Online (Sandbox Code Playgroud)
然后使用buffer.ptr.
另一个解决方案是使用这样的方法:
char* toStringz(in char[] s)
{
string result;
if (s.length > 0 && s[$ - 1] == '\0') //Is it null-terminated?
{ result = s.dup; }
else { result = new char[s.length + 1]; result[0 .. s.length][] = s[]; }
return result.ptr;
}
Run Code Online (Sandbox Code Playgroud)
这是最有效但也是最长的.
(编辑:哎呀,我有一个错字if;修好了.)
| 归档时间: |
|
| 查看次数: |
2587 次 |
| 最近记录: |