Если вы хотите передать изменяемый char*
в функцию C, вам нужно выделить изменяемый char[]
.string
не сработает, потому что он неизменен (char) [].Вы не можете изменять неизменяемые переменные, поэтому нет способа передать string
в функцию (C или иначе), которая должна изменить свои элементы.
Итак, если выиметь string
, и вам нужно передать его функции, которая принимает char[]
, затем вы можете использовать to!(char[])
или dup
и получить изменяемую копию этого.Кроме того, если вы хотите передать его в функцию C, вам нужно добавить к нему '\0'
, чтобы он заканчивался нулем.Самый простой способ сделать это - просто сделать ~= '\0'
на char[]
, но более эффективным способом, вероятно, было бы сделать что-то вроде этого:
auto cstring = new char[](str.length + 1);
cstring[0 .. str.length] = str[];
cstring[$ - 1] = '\0';
В любом случае вы затем передаете cstring.ptr
к функции C, которую вы вызываете.
Если вы знаете , что функция C, которую вы вызываете, не собирается изменять строку, то вы можете сделатькак KennyTM предлагает и изменить сигнатуру функции C в D, чтобы получить const(char)*
, или вы можете привести строку.например,
auto cstring = toStringz(str);
cfunc(cast(char*)cstring.ptr);
Изменение подписи функции C было бы более правильным и менее подверженным ошибкам.
Звучит так, как будто мы изменяем std.conv.to
, чтобы быть достаточно умными, чтобы превратить строки вСтроки с нулевым символом в конце при преобразовании в char*
, const(char)*
и т. д. Итак, как только это будет сделано, получить изменяемую строку с нулевым символом в конце должно быть проще, но на данный момент вам просто нужно скопировать строку и добавить'\0'
к нему, чтобы он заканчивался нулем.Но, тем не менее, вы никогда не сможете передать string
в функцию C, которая должна его изменить, потому что string
не может быть мутирован.