首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`STRSAFE_NO_TRUNCATION`和`STRSAFE_NULL_ON_FAILURE`值有什么不同?

`STRSAFE_NO_TRUNCATION`和`STRSAFE_NULL_ON_FAILURE`值有什么不同?
EN

Stack Overflow用户
提问于 2015-10-30 10:46:40
回答 1查看 132关注 0票数 4

StringCchCopyEx函数有自己的标志的值STRSAFE_NULL_ON_FAILURESTRSAFE_NO_TRUNCATION。我正在读MSDN,我看不出它们的区别:

STRSAFE_NULL_ON_FAILURE 如果函数失败,则pszDest设置为空字符串(TEXT(""))。在STRSAFE_E_INSUFFICIENT_BUFFER失败的情况下,任何截断的字符串都会被覆盖。 STRSAFE_NO_TRUNCATIONSTRSAFE_NULL_ON_FAILURE一样,如果函数失败,则pszDest设置为空字符串(TEXT(""))。在STRSAFE_E_INSUFFICIENT_BUFFER失败的情况下,任何截断的字符串都会被覆盖。

而且,我没有看到代码结果中有什么不同:

代码语言:javascript
复制
LPCTSTR pSrc = L"ASDFGHJK";

size_t charsCount = 5;
size_t buffer_size = charsCount * sizeof(TCHAR);
TCHAR *buffer = (TCHAR *) malloc(buffer_size);
ZeroMemory(buffer, buffer_size);    

// Now I generate the STRSAFE_E_INSUFFICIENT_BUFFER result...

LPTSTR pDestEnd = NULL;
size_t remaind = 0;

// The MEMORY content after the StringCchCopyEx executing:
// 00 00 53 00 44 00 46 00 00 00 fd fd fd fd ab ab ab ab ab
// DWORD dwFlags = STRSAFE_FILL_BYTE('X') | STRSAFE_NO_TRUNCATION;

// The MEMORY content after the StringCchCopyEx executing:
// 00 00 53 00 44 00 46 00 00 00 fd fd fd fd ab ab ab ab ab
DWORD dwFlags = STRSAFE_FILL_BYTE('X') | STRSAFE_NULL_ON_FAILURE;

HRESULT result = StringCchCopyEx(buffer, charsCount, pSrc, &pDestEnd, &remaind, dwFlags);

对于这两种情况,内存都有相同的内容..。STRSAFE_NO_TRUNCATIONSTRSAFE_NULL_ON_FAILURE值有什么不同?

EN

回答 1

Stack Overflow用户

发布于 2015-10-30 12:55:01

一个安全的字符串函数与混乱的文档,什么会出错?两者的不同之处在于,当您还使用带有非零填充的STRSAFE_FILL_ON_FAILURE时,就会编写零终止符:

  • 如果您希望看到结果字符串中的填充,请使用STRSAFE_NO_TRUNCATION,零将写在末尾。
  • 使用STRSAFE_NULL_ON_FAILURE总是得到一个空字符串。填充仍然是写的,但超过了0。

注意填充剂工作方式上的缺陷。可能是那些令人困惑的文档背后的原因。它只能是0到255之间的值,当然,这个值只能在StringCchCopyExA()中正常工作。Unicode版本将生成中文"塘塘塘塘“(在您的例子中),这几乎迫使您使用0作为填充。在这种情况下,确实没有什么区别了,而且文档是足够准确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33434131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档