String dlang如何将char[]转换并修剪为字符串?

String dlang如何将char[]转换并修剪为字符串?,string,d,String,D,我试图将缓冲区转换为字符串,但显然存在无法删除的空间 如何剥离此空间并将char[]转换为字符串容器 string getClass(HWND hwnd=NULL){ char[100] str; GetClassNameA(hwnd, str.ptr, str.length); writeln(str.dup.strip,'"'); //nothing is stripped, str is printed as 100 characters writeln(s

我试图将缓冲区转换为字符串,但显然存在无法删除的空间
如何剥离此空间并将char[]转换为字符串容器

string getClass(HWND hwnd=NULL){
    char[100] str;
    GetClassNameA(hwnd, str.ptr, str.length);
    writeln(str.dup.strip,'"'); //nothing is stripped, str is printed as 100 characters
    writeln(str[99]=='\0'); //false
    writeln(str[99]==' '); //false
    writeln(str.dup[99]=='\0'); //false
    writeln(str.dup[99]==' '); //false
    writeln(str.dup.strip[99]=='\0'); //false
    writeln(str.dup.strip[99]==' '); //false
    return to!string(str).strip; //same nothing is stripped
}

您需要使用正确的长度对缓冲区进行切片
GetClassName
返回字符串的长度,因此执行以下操作

char[100] buffer;
auto recv = GetClassNameA(hwnd, buffer.ptr, buffer.length);
if(recv == 0) throw new Exception("failed");
char[] str = buffer[0 .. recv];
// now you can work with str

你说得对,谢谢。幸运的是GetClassName返回了长度。不幸运的是,这完全是为这样的用途而设计的。如果没有,你也可以扫描字符串中的零终止符(
strlen
函数)并用该btw进行切片。确实如此,你只需通过
.ptr
就可以了
char[]str=fromStringz(buffer.ptr)
也可以工作(它的实现只是strlen,但打包得更好:
返回cString?cString[0..strlen(cString)]:null;
)。不过,您不想将静态数组传递给它,因为这样会得到一个指向比其父级更长寿的临时数组的指针。