将临时字符数组转换为D中的字符串 我正在学习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()); }
我在我的回报声明中得到:将临时字符数组转换为D中的字符串 我正在学习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()); },d,D,我在我的回报声明中得到: test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string < >,在C++中,它会调用构造函数来生成字符串。它说隐式,所以让我们用C风格的强制转换来强制转换它:return(string)buffer test.d(11): Error: C style cast illegal, use cast(string)buffer 啊,好吧,我
test.d(11): Error: cannot implicitly convert expression (buffer) of type char[100] to string
< >,在C++中,它会调用构造函数来生成字符串。它说隐式,所以让我们用C风格的强制转换来强制转换它:return(string)buffer代码>
test.d(11): Error: C style cast illegal, use cast(string)buffer
啊,好吧,我记得,不同的语法
return cast(string)buffer;
现在它编译了,但我只是得到了垃圾
我假设这是因为它在字符串中存储指向临时缓冲区的指针。我不想这样做,我想把字符复制成字符串,但令人烦恼的是,我似乎找不到如何做到这一点
因此,问题是:
如何从正确分配存储的字符数组构造实际字符串?(复制字符)
分配这样一个随机大小的缓冲区并将其转换为字符串似乎很难看。在D中有没有合适的方法?(我指的是一般性问题,而不是专门针对这个API,以防有另一个API获取计算机名)
如果手册中回答了其中任何一个问题,我应该在哪里查找详细信息
谢谢您的帮助和建议。我想您需要:
string name()
{
char buffer[100];
uint size = 100;
GetComputerNameA(buffer.ptr, &size);
return buffer[0 .. size].idup;
}
buffer.idup
是获取不可变副本的标准方法。在这种情况下,由于您需要动态调整大小的字符串
(回想一下字符串
实际上只是不可变(char)[
)的简写形式),因此您需要缓冲区[0..size].idup,使用D的数组切片
有关更多信息,请参阅
(这有点吹毛求疵,但您可能希望使用buffer.ptr
而不是&buffer[0]
,主要是为了可读性。)在转换之前,您能否尝试检查buffer
的实际值,因为转换不会失败。转换工作正常。。。如果我在函数中打印它。。。如果我返回字符串,它将失败,可能是因为它仍然引用临时缓冲区。@Bauss,不,它不应该。事实上,2.068终止编译时使用:Error:escaping引用到局部变量buffer
@sigod原始代码在我的上编译时没有任何错误或警告…@jcode,非常感谢,这很有效。好了,信息现在清楚了。当您不熟悉一种语言时,可能很难知道在文档中查找什么。谢谢你的挑剔!这正是我刚接触D:)时需要的建议,但它仍然是ignoreerror\u BUFFER\u OVERFLOW&GetLastError。正确的代码应该检查size
是否小于buffer.length,并以其他方式分配新的更大的缓冲区是的,当然,我的原始示例只是我为演示我的问题而编写的最短示例。它并不打算完整。