0

我正在使用 GetPrivateProfileStringA 从 .ini 文件中读取一些内容。我有一些其他类,我将东西与字符串数组一起保存。我必须像这样使用它来将正确的字符串放入 ControlAlt 数组中:

char buffer[24];
GetPrivateProfileStringA("CONTROLS",
    "ShiftUpAlt",
    "LeftThumb",
    buffer,
    (DWORD)24,
    "./Gears.ini");
scriptControl->ControlAlt[ScriptControls::ControlType::ShiftUp] = buffer;

我试过直接把它放进去,像这样:

GetPrivateProfileStringA("CONTROLS",
    "ShiftUpAlt",
    "LeftThumb",
    (LPSTR)scriptControl->ControlAlt[ScriptControls::ControlType::ShiftUp],
    (DWORD)24,
    "./Gears.ini");

但是 ControlAlt 中的值是一个 LPSTR,稍后在将其与适当的字符串进行比较时会产生复杂性。有没有办法不为此使用缓冲区?

ControlAlt 定义为std::string ControlAlt[SIZEOF_ControlType];

4

1 回答 1

1

GetPrivateProfileStringA需要一个缓冲区来将经典的 C 风格'\0'终止的字符串写入其中,而 astd::string不是这样的缓冲区,尽管如您所见,C 风格的字符串可以转换为 a std::string

更具体地说,GetPrivateProfileStringA期望一个char *LPSTR在 Windows API 术语中)指向一个可写缓冲区和该缓冲区的长度。 std::string不提供这个 - 充其量,它提供c_str() 返回const char *LPCSTR在 Windows API 术语中)的访问器 - 一个指向只读缓冲区的指针。缓冲区数据的const-ness 很好地表明修改它是一个坏主意,并且很可能会导致未定义的行为。

C++ '98 说:“程序不得更改此序列中的任何字符。” 然而,符合较新标准的实现可能更愿意忍受猴子业务:resize()使缓冲区足够大,然后用于&foo[0]获取char *不是的const(或只是const_cast取消保护data()),让GetPrivateProfileStringA写入缓冲区,然后在它降落std::string的地方截断。'\0'但是,这仍然不允许您将 astd::string直接传递给需要缓冲区指针的函数,因为它们不是一回事 - 它只是让您有机会避免从缓冲区中复制字符串一次。

于 2016-02-26T00:51:45.843 回答