【问题标题】:std::wstring Is converting first character randomlystd::wstring 正在随机转换第一个字符
【发布时间】:2016-03-16 11:13:24
【问题描述】:

我有这段代码:

const char * c = &(4:); //This pointer contains "JPG" string

//Wide char conversion
wchar_t *cc = new wchar_t[128];
MultiByteToWideChar(CP_ACP, 0, c, -1, cc, wcslen(cc));

然后我声明一个 wstring 变量:

wstring sFilter;
sFilter.append(L"Format: ");
sFilter.append(cc);
sFilter.push_back('\0');
sFilter.append(L"*.");
sFilter.append(cc);
sFilter.push_back('\0');
sFilter.push_back('\0');
const wchar_t * extensionFilter = sFilter.c_str();

我正在形成这个 wchar_t 以将过滤器应用于 WinApi 中的 GetOpenFileName 函数:ofn.lpstrFilter = extensionString; 这是结构的成员。

扩展过滤器随机包含:“3ormat:JPG”或“:ormat:JPG”...

我无法将项目更改为 Unicode,因为我正在使用的 IDE 不允许这样做。所以我需要使用它。

【问题讨论】:

  • &(4:) 应该是什么?那不是有效的代码。
  • 这不是 C++ 标准的有效代码,我正在开发一个以这种方式传递参数的 IDE (CA Plex)。 IDE 解释 &(4:) 并将其替换为有效值。

标签: c++ unicode std wstring wchar


【解决方案1】:
wchar_t *cc = new wchar_t[128];
MultiByteToWideChar(CP_ACP, 0, c, -1, cc, wcslen(cc));

new[] 不会填满它分配的内存。您在不能保证以空值终止的缓冲区上调用 wcslen()。即使是这样,null 也会在缓冲区的前面,因此wcslen() 将返回 0。您需要传递已分配缓冲区的实际长度:

MultiByteToWideChar(CP_ACP, 0, c, -1, cc, 128);

我无法将项目更改为 Unicode,因为我正在使用的 IDE 不允许这样做。

您无需更改整个项目。无论如何,这只会影响基于TCHAR 的声明。由于您的输入数据是 Ansi,您可以直接调用 GetOpenFileNameA() 而不必担心先将输入数据转换为 Unicode:

const char * c = ...; //This pointer contains "JPG" string

string sFilter;
sFilter.append("Format: ");
sFilter.append(c);
sFilter.push_back('\0');
sFilter.append("*.");
sFilter.append(c);
sFilter.push_back('\0');
sFilter.push_back('\0');
const char * extensionFilter = sFilter.c_str();

OPENFILENAMEA ofn;
...
ofn.lpstrFilter = extensionFilter;
...
GetOpenFileNameA(&ofn);

【讨论】:

  • 修复了那部分,但问题没有解决。谢谢。
  • 请查看这篇文章,我在使用 ANSI 时遇到了问题,解决方案是使用 Unicode:stackoverflow.com/questions/34201213/…
  • 您似乎并没有完全理解空终止字符串的实际工作原理,尤其是与std::(w)string 相关的情况。你一直在滥用它们,这就是你陷入这种麻烦的原因。您在另一个问题中的问题与 Ansi vs Unicode 完全无关(建议使用 Unicode,因为这是您应该使用的,但这是一个单独的问题)。一开始您根本没有正确管理字符串数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多