gpt4 book ai didi

c++ - StringCch* 函数和 Cstring

转载 作者:行者123 更新时间:2023-11-27 23:38:59 25 4
gpt4 key购买 nike

我在代码中使用字符串安全函数 (StringCch*)。但是,有些函数我想将变量从 WCHAR * 转换为 CString。此代码在 StringCchCopy 函数上失败:

CString sFile;
sFile.Preallocate(64);
StringCchCopy(sFile, 64, L"ini");

DWORD rv = sFile.GetAllocLength();
rv = sFile.GetLength();

TCHAR sVal[64] = {0};
StringCchCopy(sVal, 64, sFile.GetBuffer());

我确定答案很简单,但我有点难过!

GetAllocLength() 返回 71。它不应该返回 64 吗?

最佳答案

StringCchCopy(sFile, 64, L"ini"); 我很惊讶这甚至可以编译。 StringCchCopy 的第一个参数应该是指向目标缓冲区的非常量指针。 CString 不应该隐式转换为这样的东西(至少就我上次认真使用 CString 时所知道的而言)。因此,无论它在做什么,都可能不是您想要的。

如果你打算这样做,使用 GetBuffer 的重载可能更容易。其长度与 ReleaseBuffer 相结合.

GetBuffer(X) 确保 CString 有一个内部缓冲区,其中有足够的空间来容纳 X -1 个字符和一个 null 终止符,并返回一个指向该缓冲区的非常量指针。

然后 ReleaseBuffer 将导致 CString 查看已写入该缓冲区的内容,找到空终止符,并计算出它现在管理的字符串的长度。 (如果您想在没有空终止符的情况下执行操作,请详细阅读文档以了解如何正确使用它。)

有点像

CString sFile;
StringCchCopy(sFile.GetBuffer(63), 64, L"ini");
sFile.ReleaseBuffer();

之后 sFile 应该是有效的并且包含数据。 GetLength 将反射(reflect)这一点。

我不会担心 GetAllocLength。尽管 MSDN 似乎没有对此进行太多解释,但如果它返回内部缓冲区的整个长度,我不会感到惊讶——CString 可能出于某些特定原因决定超大。除非你真的想对某些东西进行微优化(在这种情况下你为什么还要使用 CString),否则你永远不需要担心这些事情。


然而,这一切都没有意义,因为您可以只执行 sFile = L"ini"; 这更简单,并且避免了因缓冲区大小错误而导致的任何潜在的差一错误.

即使这是一个简化的示例,如果您的代码有一个字符串(指向 char 数组的指针),那么您仍然可以直接将其与 CString 的赋值运算符一起使用。 (假设数据以 null 终止,并且我们没有进入 char vs wchar 领域,在这种情况下,您可能需要的不仅仅是 StringCchCopy。)

关于c++ - StringCch* 函数和 Cstring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57084759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com