Map 使用AnsiString作为映射中的键时出现奇怪的问题
我有一张地图Map 使用AnsiString作为映射中的键时出现奇怪的问题,map,c++builder,c++builder-2010,ansistring,Map,C++builder,C++builder 2010,Ansistring,我有一张地图 map 当我试图在映射中查找值时,我使用从TMemoryStream收到的字符串,并将其发送到Foo*GetFoo(AnsiString)函数,该函数反过来创建迭代器并返回找到的对象。这在大多数情况下都可以正常工作,但在一个函数中它不返回值 如果我执行FooID=FooID.SetLength(FooID.Length()-1)其中FooID是用于查找的AnsiString,它工作并返回正确的结果。我原以为流中可能有一些垃圾,但当我看到在开箱即用的地方和需要破解的地方使用的答案时,
map
当我试图在映射中查找值时,我使用从TMemoryStream
收到的字符串,并将其发送到Foo*GetFoo(AnsiString)
函数,该函数反过来创建迭代器并返回找到的对象。这在大多数情况下都可以正常工作,但在一个函数中它不返回值
如果我执行FooID=FooID.SetLength(FooID.Length()-1)
其中FooID
是用于查找的AnsiString,它工作并返回正确的结果。我原以为流中可能有一些垃圾,但当我看到在开箱即用的地方和需要破解的地方使用的答案时,它们是一样的
这是根据IDE的调试值检查器。。。所以那里可能有一些诡计。但究竟是什么导致了这一切呢
更新:
我发现使用了操作符>
的实现
PACKAGE TStream & operator >>(TStream &Stream, AnsiString &s)
{
int i;
Stream.ReadBuffer(&i, sizeof(i));
if (i<0)
{
WideString ws;
i=-i;
ws.SetLength(i);
if (i>0)
Stream.ReadBuffer(ws.c_bstr(), i*sizeof(wchar_t));
s=ws;
} else if (i>0)
{
s.SetLength(i);
Stream.ReadBuffer(s.c_str(), i);
} else
s="";
return Stream;
}
PACKAGE-TStream&operator>>(TStream&Stream、AnsiString&s)
{
int i;
Stream.ReadBuffer(&i,sizeof(i));
if(i0)
ReadBuffer(ws.c_bstr(),i*sizeof(wchar_t));
s=ws;
}如果(i>0),则为else
{
s、 设定长度(i);
Stream.ReadBuffer(s.c_str(),i);
}否则
s=“”;
回流;
}
单步执行似乎可以正确处理接收到的字符串。但我似乎记得听说WideString
的问题并不少见:P
更新2:
我实际上发现了一个实例,其中返回的字符串长度为6个字符,加上结尾
\0
,但大小设置为7。因此,我想我的解决方案是在发送该字符串的应用程序中,因为它提供了错误的大小。它们显然不相同,因为需要截断额外的字符才能使其正常工作。因此,找出额外的char
实际上是什么。要么流数据中有垃圾,要么从流中读取ansisting的代码中有一个引入垃圾的逻辑错误
使用调试检查器时,请确保考虑到了AnsiString的整个长度。默认情况下,检查器将AnsiString视为以null结尾的字符串,因此在遇到找到的第一个null字符时停止显示数据,因此您可能需要使用检查器的“范围”选项查看AnsiString内存中实际存在的所有内容。显然;)。。。读取AnsiString
的代码基本上是TMemoryStream*数据;安斯廷福*数据>>foo
,与在工作的地方一样。是的,问题是有意将内容添加到发送应用程序的一个特定字符串中,导致长度不正确。*数据>>foo
这是如何编译的?无论是TMemoryStream
还是ansisting
都不能定义从流中读取字符串的>
运算符。您是否实现了自己的自定义运算符?正如您在上面看到的,我确实找到了该运算符的自定义实现。