在每个数组元素之后终止 null

问题描述 投票:0回答:1

我想将文本保存在txt文件中。我在编辑控件中输入“something”并单击 IDC_ADD,然后我调试代码,字符数组 buf 在每个元素之后都有。我认为这就是为什么没有保存“某物”的原因。

c++ winapi
1个回答
1
投票

您所看到的称为 Unicode。或者更具体地说:UTF-16。又名“宽弦”。每个字符是 16 位(2 字节)而不是 8 位。

默认情况下,大多数 Visual C++ 程序编译时默认启用 UNICODE。在与 Windows API 交互时,只需坚持使用 Unicode 16 位字符串并使用 wchar_t* 和 std::wstring 代替 char* 和 std::string。

甚至还有一个用于宽字符串的 wregex 库。

您的代码中的错误是您明确地将

buf
转换为 LPTSTR。你可能这样做了,因为那是它能够编译的原因。

更好:

wchar_t buf[MAX] = {};
GetDlgItem(hwnd, IDC_EDIT_FLD, buf, MAX);

如果您需要在 ascii 和宽字符串之间进行转换,Windows 提供了 API:MultiByteToWideCharWideCharToMultiByte

如果你想用 ascii 字符串调用 Windows API,你可以显式地使用“A”变种:

char buf[MAX] = {};
GetDlgItemA(hwnd, IDC_EDIT_FLD, buf, MAX);

或者“W”品种,反正是默认的:

wchar_t buf[MAX] = {};
GetDlgItemW(hwnd, IDC_EDIT_FLD, buf, MAX);

正如我在上面的评论中指出的那样,LPTSTR 和相关的 TCHAR 类型是 Windows 编程的古老遗迹,需要从地球上抹去。它使 Windows 9x 程序能够使用 ASCII API 支持进行编译,而 Windows NT 程序能够被编译为 Unicode。除非您有将代码移植到 Windows 98 的要求,否则您不需要使用 TCHAR 类型。

© www.soinside.com 2019 - 2024. All rights reserved.