Nul终止了字符数组

时间:2015-09-25 07:43:46

标签: d

这个简单的D程序: -

import std.stdio;
import core.sys.windows.windows;

void main()
{
    char data[100];
    uint size = 100;
    GetComputerNameA(&data[0], &size);
    writeln("Name is:", data, "with size of ", size);
}

打印计算机的名称,然后打印字符数组其余部分的未初始化内容。它没有将数据视为writeln中的nul终止字符串。

那很好,我可以看到很多方法来解决这个问题。 但是什么是正确的"在D中处理这个问题的惯用方法? (在打印,分配内存,转换为正确的字符串等?)

修改 我刚才意识到我问过一个非常相似的问题here,但我想这不是一回事。

1 个答案:

答案 0 :(得分:1)

使用std.string.fromStringz

import std.stdio;
import std.string;
import core.sys.windows.windows;

void main()
{
    char[100] data;
    uint size = data.length;
    GetComputerNameA(&data[0], &size);
    data[$-1] = 0; // ensure null-terminated
    writeln("Name is: ", data.ptr.fromStringz);
}

在这种情况下,您可能希望使用GetComputerName的第二个参数,例如:data[0..size]。如果缓冲区不够大,请务必检查函数的返回值。