我正在学习D语言(我很熟悉C++)...我想做一些Windows特定的东西,所以我写这个只是为了试用API:
import core.sys.windows.windows;
import std.stdio;
string name()
{
char buffer[100];
uint size = 100;
GetComputerNameA(&buffer[0], &size);
return buffer;
}
void main()
{
writeln(name());
}
Run Code Online (Sandbox Code Playgroud)
我收到了回复声明:
test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string
Run Code Online (Sandbox Code Playgroud)
好吧,在C++中,它会调用构造函数来创建一个字符串.它表示隐式,所以让我们用C样式转换:return (string)buffer;
.
test.d(11): Error: C style cast illegal, use cast(string)buffer
Run Code Online (Sandbox Code Playgroud)
好的,我记得,语法不同.
return cast(string)buffer;
Run Code Online (Sandbox Code Playgroud)
现在它编译但我只是垃圾.
我认为那是因为它将字符串中的指针存储到临时缓冲区.我不想这样做,我想把字符复制成一个字符串,但我很烦人,我似乎无法找到如何做到这一点?
所以问题:
如何从正确分配存储的char数组构造实际字符串?(复制字符)
像这样分配一个随机大小的缓冲区并转换为字符串似乎很难看.在D中有没有正确的方法呢?(我正在谈论一般性问题,不是专门针对此API,以防万一有另一个API来获取计算机名称).
如果在手册中回答了其中任何一个,我应该在哪里查找详细信息?
感谢您的帮助和建议.
我想你需要:
string name()
{
char buffer[100];
uint size = 100;
GetComputerNameA(buffer.ptr, &size);
return buffer[0 .. size].idup;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
buffer.idup
是获取不可变副本的标准方法.对于这种情况,因为你想要一个动态大小string
(并且召回string
实际上只是简写immutable(char)[]
),你想要buffer[0..size].idup
,使用D的数组切片.
有关更多信息,请参见http://dlang.org/arrays.html.
(这有点挑剔,但你可能想要使用buffer.ptr
而不是&buffer[0]
,主要是出于可读性的考虑.)