双以null结尾的字符串

时间:2011-01-06 02:28:16

标签: c++ string mfc shfileoperation

我需要将字符串格式化为双尾终止字符串才能使用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);

有人对此有所了解吗?

是否有其他方法可以附加双端字符串?

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

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

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

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