Dziwnym trafem funkcja zamienia pierwsza litere stringa

0

Witam. Mam napisaną hashmapę-słownik (nie moge korzystac z STLowych). Wrzucam do niej stringi. (mapa jest na template)
Problem tkwi w tym, że gdy wpycham do niej insertem wyraz "milo" ze stringa do_zmiany to do hash mapy trafia string "lilo", gdy wpisze "bilo" dostaje "ailo" tak jakby pierwsza litera stringa byla cofnieta o 1.

wszystko psuje funkcja insert.
co najdziwniejsze, tuż przed returnem w insercie string do_zmiany wygląda jeszcze jak "milo" jednak gdy postawię couta od razu po wykonaniu funkcji do_zmiany wygląda już jak "lilo". Do hashmapy też dziwnym trafem trafia "lilo".

Wiem, że to skomplikowany problem, ale może komuś uda się to rozkminić:

trzy pliki, kompiluj maina, a reszta zadziala ze soba.
hashmap.h
http://pastebin.com/qHn5LmN1

main.cpp
http://pastebin.com/KtZADk4w

dane.txt
http://pastebin.com/jqDpzYQA

wygląda to tak, że metoda parsujTekst() parsuje nam plik dane.txt (trzeba podac nazwe pliku po starcie programu) i gdy napotka komende #define costam jakies wyrazenie to wstawia do hashmapy parę costam <-> jakies wyraznie
hashuje na podstawie costam.

zaciąłem się przy wstawianiu (metoda void liniaHash(string &linia) linijka 137, wszystko kreci sie w tej okolicy)
nie wiem dlaczego moj string jest zmieniany.
main.cpp ma juz przykladowe testy ktore wykonywalem, wypisuje wszystko co nie gra.

Założenie programu jest takie, ze wstawia sobie do hashmapy słowa które ma w pliku podmienić, a potem je podmienia.
Poradzę sobie z tym, ale rozwala mnie ten insert... COŚ jest nie tak.. nie wiem CO :/

bardzo ładnie proszę o pomoc, mi już głowa od tego pęka...

PS
wstawiając tak:

string pierwszy = "pawel";
    string drugi = "milosz";
    
    obiekt.insert(make_pair(pierwszy, drugi));

wszystko działa :/ insert nic nie psuje itd.. dziwne..

1

Przed pójściem spać chciałem sprawdzić jeszcze jedną opcję, wleciała mi do glowy gdy myłem zęby. To nie było to, ale zauwazyłem, że metoda nie miala "return wyraz". gdy to dopisałem od razu zaczelo wszystko smigac.

string pobierzWyrazenie(string &linia)
{
    string wyraz;
    for (unsigned int i=0; i<= linia.size();++i)
    {
        if (linia[i]>= ' ' && !(linia[i]=='/'&&linia[i+1]=='/') ) //dopoki nalezy do znakow drukowalnych i nie jest komentarzem
        {
            wyraz+=linia[i];
        }
        else
        {
            linia.erase(0,i+1);
            return wyraz; // <<<<<<<<<<<<<<<<<<<<<<<TUTAJ!
        }
    }
};

DO ZAMKNIĘCIA

@Sarrus
Masz racje, brakowało! w sumie pustej linii chyba by nawet nie puscila ktoras funkcja wczesniej, ale na wszelki wypadek dobrze miec :) dziekuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1