在c++中,如果我通过引用将CString传递给函数并将其分配给另一个CString,它将被截断
in c++, if I pass a CString to a function by reference and assign it to another CString it is truncated
一些简单的代码已经开始在我一直在使用的sdk中失败,而且它显然已经正常工作了很长一段时间,实际上我几乎肯定我已经编译了像这样的部分代码并且它们已经工作,但最近失败了。
在调试器中确认值的示例:
void SomeFunction(CString& paramstring) //let's pretend we pass a string with the value "hello"
{
int size=paramstring.GetLength(); //size now contains an incorrect shorter value like 4
CString localstring=paramstring;//localstring contains something like "hell" or "hel"
}
知道为什么会这样吗
我已经在控制台应用程序中尝试了您的代码,它工作得很好,问题来自您的代码的另一部分这里是代码尝试一下(使用MFC)
#include <iostream>
#include <afx.h>
using namespace std;
//let's pretend we pass a string with the value "hello"
void fun(CString& paramstring)
{
int size=paramstring.GetLength();
cout<<"size= "<<size<<"n";
CString localstring=paramstring;
wcout<<"string = "<<(LPCTSTR)localstring<<"n";
}
int main()
{
CString s ("Hello");
fun(s);
}
输出:size = 5 string = Hello
我唯一的猜测是您有内存覆盖损坏了该对象。
是时候拿出电动工具了。安装Purify或者Boundschecker,然后寻找你的bug。我在过去的CString代码中犯了一个错误,它在作为参数传递时阻止了CString正确工作。你的问题可能完全不同,但我将在这里解释我做了什么导致了问题,因为它可能会帮助别人。
我的CString包含一个目录名。为了稍微清理一下,我检查了最后一个字符是否为'',如果是,我通过直接覆盖CString内部的字符将其替换为' '。
这可能在某种程度上破坏了CString的完整性,因为通过strlen()等方法测量的字符串长度与缓冲区的实际大小之间存在不匹配。我对这个问题的解释可能不正确,但我认为它基本上归结为我破坏了CString的完整性。
我修复了我的问题,将我的语句替换为类似的东西目录名= dirname.Left (dirname.GetLength () 1);
我是凭记忆写这篇文章的,不经常使用这些函数,所以如果我记错了函数名,请原谅我。无论如何,我的建议是不要将空字符写入CString的中间以缩短它,并且如果将CString作为参数出现问题,则查找(除其他事项外)。
啊,是的,我想问题可能和你的正好相反。如果您通过覆盖一个字符来缩短字符串,那么GetLength()可能会返回旧值,该值比您可能期望的要大。我的实际问题是dir + "" + filename不工作。我想它是在连接包含null的字符串,并且最终值只是目录部分,因为这是添加null的地方。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- 使用指针 c++ 反转函数中的 cstring 数组
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- 为什么所有函数<cstring>都不能有 constexpr?
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 我正在尝试创建自己的 strcat() 函数,而不是使用库实现函数<cstring>
- C++:没有字符串<cstring>函数
- 返回 CString 将调用析构函数
- 需要将cstring转换为byte*,并需要在c++函数中将其作为i/p参数传递
- 在c++中,如果我通过引用将CString传递给函数并将其分配给另一个CString,它将被截断
- 如何在c++函数中将cstring参数值复制到本地cstring
- 如何将cstring复制到构造函数初始化列表中的成员变量
- 如何在函数中初始化CString&参数
- 为什么CString(LPCTSTR lpsz)构造函数检查lpsz的高两个字节