C ++映射输出格式化垃圾

时间:2013-08-08 15:36:01

标签: c++ map format

我有一个std::map<char*,std::map<char*, char*>> ini;我将ini文件读入。

Ini文件的格式为:

[SECTIONAME]
key=value
[SECTIONNAME2]
key2=value2

所以它基本上是map<sectionName, map<key, value>>

我在地图中插入值很好,似乎:

std::cout << "inserting at section: '" << currentSection.c_str() << "', tag: '" << tag.c_str() << "', value: '" << value.c_str() << "'" << std::endl;  
ini.find(const_cast<char *>(currentSection.c_str()))->second.insert(std::make_pair(const_cast<char *>(tag.c_str()), const_cast<char *>(value.c_str())));
std::cout << "inserted key: '" << ini.find(const_cast<char *>(currentSection.c_str()))->second.find(const_cast<char *>(tag.c_str()))->first << "'" << std::endl;
std::cout << "inserted value: '" << ini.find(const_cast<char *>(currentSection.c_str()))->second.find(const_cast<char *>(tag.c_str()))->second << "'" << std::endl;

似乎没事了:

inserting at section: 'SCENARIO', tag: 'id', value: '1'
inserted key: 'id'
inserted value: '1'
inserting at section: 'SCENARIO', tag: 'base', value: '1'
inserted key: 'base'
inserted value: '1'

我迭代并打印出值:

std::map<char*, std::map<char*, char*>>::iterator iter;
for(iter = ini.begin(); iter != ini.end(); iter++) 
{
    std::map<char*, char*> innermap = iter->second;
    std::map<char*, char*>::iterator iterinner; 
    std::cout << "found section: '" << iter->first << "'" << std::endl;
    for(iterinner = innermap.begin(); iterinner != innermap.end(); iterinner++) 
    {
        std::cout << "key: '" << iterinner->first << "', value: '" << iterinner->second << "'" << std::endl;
    }
}

在我迭代并打印出来后,我明白了:

found section: 'á♦╧'
key: '', value: ''
key: 'Φ↑╧', value: ''

为什么我会在迭代中获得垃圾?谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

不要将指针用作键,因为实际的指针是键,而不是指向的键。如果要将字符串用作键,请使用std::string

我当然建议您使用std::string作为内部地图中的数据。

存储指针,特别是指向临时数据的指针,就像灾难和未定义的行为一样。

答案 1 :(得分:0)

对最初声明为const的对象执行的const_cast未定义。 不确定c_str()

返回的数据的内部表示是否是这种情况

另请阅读http://www.cplusplus.com/reference/string/string/c_str/

“通过进一步调用修改对象的其他成员函数,可能会使返回的指针无效。”

正如Jaochim所建议的那样,使用std :: string作为键