Phobos中是否有用于将零终止字符串转换为D字符串的函数?
到目前为止,我只找到了相反的情况toStringz
。
我在以下代码段中需要这个
// Lookup user name from user id
passwd pw;
passwd* pw_ret;
immutable size_t bufsize = 16384;
char* buf = cast(char*)core.stdc.stdlib.malloc(bufsize);
getpwuid_r(stat.st_uid, &pw, buf, bufsize, &pw_ret);
if (pw_ret != null) {
// TODO: The following loop maybe can be replace by some Phobos function?
size_t n = 0;
string name;
while (pw.pw_name[n] != 0) {
name ~= pw.pw_name[n];
n++;
}
writeln(name);
}
core.stdc.stdlib.free(buf);
用于从用户ID中查找用户名。
我现在假设UTF-8兼容性。
答案 0 :(得分:6)
有两种简单的方法:slice或std.conv.to:
const(char)* foo = c_function();
string s = to!string(foo); // done!
或者,如果您要临时使用它,或者知道它不会被写入或在其他地方释放,您可以对其进行切片:
immutable(char)* foo = c_functon();
string s = foo[0 .. strlen(foo)]; // make sure foo doesn't get freed while you're still using it
如果你认为它可以被释放,你也可以通过切片然后复制来复制它:foo [0..strlen(foo)]。dup;
在所有数组的情况下,切片指针的工作方式相同,而不仅仅是字符串:
int* foo = get_c_array(&c_array_length); // assume this returns the length in a param
int[] foo_a = foo[0 .. c_array_length]; // because you need length to slice
答案 1 :(得分:2)
只需切片原始字符串(无应对)。 $ inside []被转换为str.length。如果零不在最后,只需用位置替换“$ - 1”表达式。
void main() {
auto str = "abc\0";
str.trimLastZero();
write(str);
}
void trimLastZero (ref string str) {
if (str[$ - 1] == 0)
str = str[0 .. $ - 1];
}
答案 2 :(得分:2)
您可以执行以下操作以去除尾随零并将其转换为字符串:
char[256] name;
getNameFromCFunction(name.ptr, 256);
string s = to!string(cast(char*)name); //<-- this is the important bit
如果您只是传入name
,则会将其转换为字符串,但尾随的零仍将存在。所以你把它转换成一个char指针,然后std.conv.to
将转换它遇到的任何东西,直到遇到'\0'
。