【问题标题】:MFC CString Format gives weird behaviourMFC CString 格式给出了奇怪的行为
【发布时间】:2011-06-28 06:37:55
【问题描述】:

CString 有一个奇怪的问题我有以下代码,它给出了意外的结果:

CString sourcePath = _T("C:\\some\\path\\file.ext");
CString log;
log.Format(_T("Path = %s"), sourcePath);

结果字符串显示Path = (null)

我不确定那里发生了什么,我尝试将 sourcePath 转换为 LPCTSTR 并获得了一个有效的指针,并且在 MSVC 的内存视图窗口中查看该内存地址的内容时一切似乎都有效。

这让我很恼火,因为我在以前的项目中尝试过相同的方法,而且效果很好。

谢谢。

附:请在人们开始在这里评论之前询问CString 是什么,就像我之前的帖子中发生的那样,请先检查这里:MSDN CString

编辑:对斜线的事情感到抱歉..是的,原始代码确实有双斜线..

【问题讨论】:

  • 此示例不会在此处重现问题。您是否检查过可能影响 sourcePath 的缓冲区溢出?这是您的文字代码,还是在您显示的 3 行之间发生了其他事情?
  • @Erik,我刚刚使用 Visual Studio 2010 和 Visual Studio 2008 对此进行了测试,但也无法重现该问题。中间肯定有其他代码在运行。
  • 遇到了同样的问题。哦,是的,我有一些使用 MFC 的旧项目;) VS2012 和 VS6 可以重现此问题。我的格式字符串是“some text %s, some text: %d, %d, %s text %s”。第一个字符串没问题,但第二个和第三个不是 - 只有“(null)”。所以我把这个巨大的格式字符串分成两个更小的,现在看起来不错。添加了第三个字符串,但没有格式。每个格式字符串一个 %s。

标签: c++ visual-studio mfc c-strings


【解决方案1】:

正如您的 MSDN CString 链接也提到的,您不能将 CString 本身传递给 Format 函数。

用途:

  log.Format(_T("Path = %s"), sourcePath.GetString());

【讨论】:

  • 您误解了文章的内容。 "The call will fail if the string object itself is offered as a parameter to Format" 表示您不能将对象作为在其上调用的方法的参数传递。传递另一个 CString 对象非常好。
  • 你完全正确,我对通过省略号传递对象的反应。现在阅读 MS 用来完成这项工作的(丑陋的)技巧。
  • 再次正如我在原帖中所说,我尝试将其转换为 LPCTSTR 并且它没有工作,还尝试了 wstring 并且遇到了同样的问题并且指针似乎有效
  • 没有。请参阅有关 CString 的文章“老大哥帮你” - viva64.com/en/b/0073
【解决方案2】:

字符串 "C:\some\path\file.ext" 应该是 "C:\some\path\file.ext" - 否则您将读取控制字符 (\s \p \f)。

【讨论】:

  • 哎呀,第二个字符串应该有双斜杠。而且我看到其他人已经先得到了答案。
  • 是的,很抱歉,实际上我在头顶上写了路径..现在修复了。
  • 嗨 - 我写了一个小测试应用程序来查看你的问题(如果你仍然遇到这个问题),下面的代码是做同样事情的解决方法 - 它可能不是你想要的我想你想解决这个问题而不是解决它: // 包括... #include #include std::string strSourcePath = "C:\\some\\path\\文件.ext";字符 szFullPath[256]; sprintf_s(szFullPath, sizeof(szFullPath), "Path = %s", strSourcePath.c_str()); CString 日志(szFullPath); - 抱歉,我在添加代码 sn-p 时遇到了一些问题。
  • 您的原始代码适用于通过向导自动生成的 SDI MFC 应用程序,因此也许值得自己这样做并比较项目设置以查看有什么不同?
【解决方案3】:

根据 MFC 版本以及您的应用是为 win32 还是 x64 构建的,您可能需要强制转换 CString:

log.Format(_T("Path = %s"), (LPCTSTR)sourcePath);

【讨论】:

    【解决方案4】:

    你的 sourcePath 初始化有问题。 字符 \ 是 C/C++ 中的特殊字符。您应该将其替换为 \ (double ) 所以第一行代码应该是:CString sourcePath = _T("C:\\some\\path\\file.ext");

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2017-01-29
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多