【发布时间】:2011-07-21 12:51:47
【问题描述】:
问题描述
我正在将 Expat 与自定义 C++ 包装器一起使用,我已经在其他项目中对其进行了测试。 我遇到了问题,因为原始数据(c_str)没有以正确的方式转换为 std::string。这让我很担心,因为我没有更改包装器的来源。
在此转换后,字符串似乎获得了以空字符结尾的字符:
onCharacterData( std::string( pszData, nLength ) ) // --> std::string( char* pszData)
我该如何解决这个问题?
自己的外籍人士包装
// Wrapper defines the class Expat and implements for example:
void XMLCALL Expat::CharacterDataHandler( void *pUserData, const XML_Char *pszData,
int nLength )
{
Expat* pThis = static_cast<Expat*>( pUserData );
// XML_Char is char, therefore this call contains i.e.: std::string("hello", 5)
pThis->onCharacterData( std::string( pszData, nLength ) );
}
自定义解析器
// Parser is defined as: class Parser : Expat
void Parser::onCharacterData(const std::string& data )
{
// data is no longer char*, but a std::string.
// It seems to contain \0 after each character which is wrong!
// [...]
}
expat 包装器中的字符数据 (char*)
解析器中的字符数据(std::string)
【问题讨论】:
-
你可以说
std::string(pszData);有一个以空结尾的 C 字符串的构造函数。 -
@Kerrek: .. 这在这里行不通! (很偶然)
-
我已经试过了。不幸的是,这不起作用。
-
耻辱。 “psz”通常表示“空终止”!
标签: c++ string expat-parser null-terminated