【问题标题】:How to add slashes to the end of a TCHAR buffer[] using Win32 C++如何使用 Win32 C++ 在 TCHAR 缓冲区 [] 的末尾添加斜杠
【发布时间】:2021-04-12 19:56:09
【问题描述】:

我正在尝试在我的 Win32 C++ 应用程序中使用 wsprintf() 将两个斜杠“\”添加到 TCHAR 缓冲区 [] 的末尾。 变量“buffer”保存一个文件路径:C:\Users\nayub\Desktop\Folder1\Hello。我想在这个文件路径的末尾添加两个斜杠,下面的代码也是如此:

wsprintf(filename_buff, buffer, L"\\");
MessageBox(hWnd, filename_buff, L"New Folder Directory", MB_OK | MB_ICONINFORMATION);

但是,消息框显示“C”而不是其他任何内容。我不确定为什么它得到“C”而不是文件路径,因为在添加斜杠之前,文件路径会正确打印出来。

【问题讨论】:

  • 我也不确定为什么它会得到“C”。您的代码中没有任何内容表明该字母的原因。请提供minimal reproducible example(包括变量声明)。
  • 如果您在编译时收到任何警告,请将它们复制/粘贴到问题中。您可能会忽略一个准确地告诉您问题所在的信息。
  • 查看wsprintf 的文档,尤其是格式字符串。如果您知道缓冲区足够大,您可以使用wcscat 附加到它。根据您的项目设置,您实际上可能会调用wsprintfA,这将给出您在传递宽字符串时所描述的行为。
  • 明显问题:您使用了错误的功能。 wsprintf 是一个奇怪的 Windows 东西,它主要是 Windows 3.x 的遗留物。你想要的几乎肯定是swprintf。下一个问题:你不应该真的摆弄TCHAR,这是另一个奇怪的 Windows 东西,在这种情况下是从 Windows 95/98 遗留下来的。无论如何,您的代码仅适用于宽字符,因此请使用 wchar_t,而不是 TCHAR

标签: c++ winapi concatenation slash


【解决方案1】:

您错误地使用了wsprintf()。它需要看起来更像这样:

wsprintf(filename_buff, L“%s\\”, buffer);

或者,您可以改用PathAddBackslash()

wcscpy(filename_buff, buffer);
PathAddBackslash(filename_buff);

但是,您将问题标记为 ,因此请改用 std::wstring

MessageBox(hWnd, (std::wstring(buffer)+L"\\").c_str(), L"New Folder Directory", MB_OK | MB_ICONINFORMATION);

【讨论】:

  • 或者,除了标签和警告之外,OP 可能正在执行非 Unicode C 编译。然后“消息框显示 'C' 而没有其他任何内容”。
  • @dxiv OP 显示的代码不会在非 Unicode 版本中编译。
  • MSVC 至少将其编译为 C,并带有预期的 C4133 警告。
  • 我按照您在示例中展示的方式使用了 wsprintf() 并且它有效!非常感谢!
  • @RemyLebeau 强调 C 编译。 MSVC does it 和 gcc does it 也是。我并不是要与 wsprintf 修复它的 OP 争论,但我看不出原始代码如何在消息框中显示一个单独的 "C",如果不是因为传递宽字符串的 ANSI 构建。反正这并不重要;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2011-08-21
相关资源
最近更新 更多