【问题标题】:Double null-terminated string双空终止字符串
【发布时间】:2011-06-04 10:01:57
【问题描述】:

为了使用 SHFileOperation,我需要将字符串格式化为双空终止字符串。

有趣的部分是我发现以下工作之一,但不是两个:

  // Example 1
  CString szDir(_T("D:\\Test"));
  szDir = szDir + _T('\0') + _T('\0');

  // Example 2  
  CString szDir(_T("D:\\Test"));
  szDir = szDir + _T("\0\0");

  //Delete folder
  SHFILEOPSTRUCT fileop;
  fileop.hwnd   = NULL;    // no status display
  fileop.wFunc  = FO_DELETE;  // delete operation
  fileop.pFrom  = szDir;  // source file name as double null terminated string
  fileop.pTo    = NULL;    // no destination needed
  fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT;  // do not prompt the user
  fileop.fAnyOperationsAborted = FALSE;
  fileop.lpszProgressTitle     = NULL;
  fileop.hNameMappings         = NULL;
  int ret = SHFileOperation(&fileop);

有人对此有想法吗?

还有其他方法可以附加双终止字符串吗?

【问题讨论】:

  • 这些都不应该工作。如果其中一个发生了,那只是一个意外。
  • @Greg:由于 CString 具有以下 friend CString operator+( const CString& string, LPCTSTR lpsz );,第二个示例不应该起作用吗? (工作是指 + 操作,而不是将 CString 传递给 SHFileOperation
  • @Eugen: 不,因为CString+ 运算符将第二个操作数视为普通的以NUL 结尾的char *,它无权查看第一个 NUL终止符。
  • @Greg:非常有道理。我将“不工作”部分解释为“没有编译”。

标签: c++ string mfc shfileoperation


【解决方案1】:

CString 类本身对包含空字符的字符串没有问题。问题在于首先将空字符放入字符串中。第一个示例有效,因为它附加了单个字符,而不是字符串 - 它按原样接受字符,而不检查它是否为空。第二个示例尝试附加一个典型的 C 字符串,根据定义,该字符串在第一个空字符处结束 - 您实际上是在附加一个空字符串。

【讨论】:

  • @Mr_and_Mrs_D 不仅仅是单引号,而是单个字符周围的单引号。正如 Mooing Duck 所观察到的,您可以将两个字符放在单引号内,但不会将两个字符附加到字符串中。
【解决方案2】:

您不能将CString 用于此目的。您需要使用自己的char[] 缓冲区:

char buf[100]; // or large enough
strcpy(buf, "string to use");
memcpy(buf + strlen(buf), "\0\0", 2);

虽然您可以通过在现有 NUL 终止符之后再复制一个 NUL 字节来做到这一点,但我更愿意复制两个,以便源代码更准确地反映程序员的意图。

【讨论】:

  • @wengseng,您确实可以使用 CString 来实现此目的,示例 1 就是您的做法。在我使用这样的固定大小缓冲区之前,我会使用std::vector<char>
  • std::string 也可以使用,然后必须恢复为 char[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多