将临时字符数组转换为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,并以其他方式分配新的更大的缓冲区是的,当然,我的原始示例只是我为演示我的问题而编写的最短示例。它并不打算完整。