从D中的字符串中获取普通char*?

Mar*_*ine 11 string d

我正试图弄清楚如何从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)


Meh*_*dad 9

是的,它不漂亮,因为结果是不可改变的.

这就是为什么我总是在我的代码中返回新数组的可变副本.让它们变成永恒是没有意义的.

解决方案:

你可以做到

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;修好了.)