3

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 兼容。

4

3 回答 3

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
于 2013-10-08T21:00:53.900 回答
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'遇到 a 为止。

于 2013-11-01T14:29:32.503 回答
2

只需切片原始字符串(无需应对)。[] 中的 $ 被转换为 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];
}
于 2013-10-08T21:15:28.423 回答