LINUX.ORG.RU

C++: map обрезается ключ...


0

0

map<const char*, int, strCmp> people_index;
people_index["Anton Kuzmin"] = 1;

По какой-то причине ключ "Anton Kuzmin" обрезается до "Anton Ku".
Содержимое объекта смотрю с помощью:
void show_index(){
map<const char*, int>::iterator it;
for(it = people_index.begin(); it != people_index.end(); it++ ) {
cout << it->first << "|" << it->second << endl;
}
}

Я ничего не делал с объектом... Вначале исполнения программы с ключом всё ОК. После ввода через cin ключ обрезается...

Фича?

★★★★

Вероятно причина в ограничениях данной реализации STL. Какую пользуешь? GCC'ную?...

Sectoid ★★★★★
()

>map<const char*, int, strCmp>

>После ввода через cin ключ обрезается...

Скорее всего, память для ключа выделяется не динамически. Тогда ключ - это указатель на буфер, который где-то переписывается (в лучшем случае). Все же лучше для ключа воспользоваться string-ом.

kosmonavt
()
Ответ на: комментарий от kosmonavt

>people_index["Anton Kuzmin"]= 1;

Слона не заметил :(

А там нигде нет записи по указателю, который не инициализирован?

kosmonavt
()
Ответ на: комментарий от theserg

>используй std::string

Желательно, конечно использовать std::string, но тут другое. Похоже на то, что какой-то указатель со случайным значением адреса на середину строки "Anton Kuzmin".

anonymous
()

Кстати, код:

map<const char*, int>::iterator it, et;
for(it = people_index.begin(), et = people_index.end(); it != et; ++it )

намного эффективнее чем:

map<const char*, int>::iterator it;
for(it = people_index.begin(); it != people_index.end(); it++ )

std::string лучше заюзать. Погугли на тему 'weirdness with std::map<const char *, int>' Это обсудалось в comp.lang.c++

Можно также использовать const_iterator вместо iterator

anonymous
()
Ответ на: комментарий от anonymous

> Можно также использовать const_iterator вместо iterator

ну можно так-же все-таки прочитать в Страуструпе главу про алгоритмы и сделать еще красивее и, возможно, быстрее.. ;)

// wbr

klalafuda ★☆☆
()

> Фича?

Конечно. У тебя в map хранятся указатели. НА ЧТО?

anonymous
()

> Вначале исполнения программы с ключом всё ОК. После ввода через cin ключ обрезается...

можно посмотреть что и куда вводится ? =)

Вы наверное получаете из cin строку во временный буфер на стеке и потом адрес этого буфера пихаете в качестве ключа в ваш map - ну так это небудет работать, буфер на стеке уничтожится после выхода за границы действия имени - соответственно ключ в вашем map будет указывать на освобождённый блок памяти (мусор)

Eshkin_kot ★★
()

Спасибо всем! Вы меня спасли :)

Selecter ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.