c++ - 如何组装一串宽字符,中间插入一些空字符?
问题描述
让我们从背景开始。我需要为 ODBC 命令设置属性字符串:
SQLConfigDataSource(hwndParent, ODBC_ADD_DSN, sDriver, wcAttrs);
必须以严格的方式对属性进行格式化才能工作:
LPCWSTR wcAttrs = L"DSN=NiceDB\0DBQ=C:\\Users\\who\\AppData\\Local\\NiceApp\\niceDB.accdb\0";
以这种方式对其进行硬编码是可行的,但我实际上需要动态设置 accdb 文件(DBQ)的路径。问题是分隔字符串中的属性所需的空字符,而我主要使用wcscat_s的 string-fu 技能失败了,因为空字符会使任何东西在它之后消失。
用中间的空字符组装/连接字符串的最佳技术是什么?
解决方案
您可以push_back
在构建时将空字符放入 std::wstring 中。
例子:
std::wstring str;
str += L"DSN=NiceDB";
str.push_back(L'\0');
str += L"DBQ=C:\\Users\\who\\AppData\\Local\\NiceApp\\niceDB.accdb";
str.push_back(L'\0');
您还可以使用 += 运算符手动附加空字符:
std::wstring str;
str += L"DSN=NiceDB";
str += L'\0';
str += L"DBQ=C:\\Users\\who\\AppData\\Local\\NiceApp\\niceDB.accdb";
str += L'\0';
您也可以只告诉 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 的东西。
推荐阅读
- c++ - 如何通过 C++ 中的另一个类访问类中的数据?
- wpf - MvvmCross 和 Xamarin.Forms.Wpf
- javascript - 有什么方法可以访问在函数中添加了事件侦听器的元素?
- php - 从数据库中提取数据。如何编写循环函数 PHP MYSQL
- sql - 如何计算四分位数范围
- node.js - Discord.js 用于删除所有不是机器人命令的消息
- javascript - Javascript 正则表达式:从多个锚标记中删除除 href 之外的所有属性。不能在正则表达式中包含双引号
- javascript - 如何编号每个
- 在我的
- 或使用项目符号列出它们
- javascript - Javascript Intl.DateTimeFormat hours12 在 Chrome 上给出奇怪的输出
- javascript - 为什么“输入”事件具有“事件”类型的事件而不是“输入事件”