如何 assemble 一串宽字符,中间插入一些空字符?

How to assemble a string of wide characters with some null ones inserted in the middle of it?

让我们从背景说起。我需要为 ODBC 命令设置一串属性:

SQLConfigDataSource(hwndParent, ODBC_ADD_DSN, sDriver, wcAttrs);

属性必须以严格的方式格式化才能工作:

LPCWSTR wcAttrs = L"DSN=NiceDB[=12=]DBQ=C:\Users\who\AppData\Local\NiceApp\niceDB.accdb[=12=]";

以这种方式进行硬编码是可行的,但实际上我需要动态设置 accdb 文件 (DBQ) 的路径。问题是分隔字符串中属性所需的空字符,我主要使用 wcscat_s 的 string-fu 技能失败了,因为空字符会使它后面的任何东西都消失。

assemble/concatenate 中间带有空字符的字符串的最佳技术是什么?

您可以在构建 std::wstring 时将空字符 push_back 转换为 std::wstring。

示例:

std::wstring str;
str += L"DSN=NiceDB";
str.push_back(L'[=10=]');
str += L"DBQ=C:\Users\who\AppData\Local\NiceApp\niceDB.accdb";
str.push_back(L'[=10=]');

您还可以使用 += 运算符手动附加空字符:

std::wstring str;
str += L"DSN=NiceDB";
str += L'[=11=]';
str += L"DBQ=C:\Users\who\AppData\Local\NiceApp\niceDB.accdb";
str += L'[=11=]';

您也可以只告诉 append 方法使用字符串文字的 +1 个字符。这将使用源中已有的空字符隐式填充 std::string:

std::wstring str;
const wchar_t* header = L"DSN=NiceDB";
const wchar_t* footer = L"DBQ=C:\Users\who\AppData\Local\NiceApp\niceDB.accdb";

str.append(header, wcslen(header) + 1);
str.append(footer, wcslen(footer) + 1);

然后获取指向最终字符串开头的指针:

LPCWSTR wcAttrs = str.c_str();

.c_str() 返回的指针的有效性仅在支持 wstring 的生命周期内有效。不要让 wstring 实例超出范围,同时还有一些东西引用 wcAttrs。