void FromLine(char *rdata[], char *rkey[], int &BLOCK_SIZE) { std::cout <<"Give string to (en/de)crypt: "; std::cin >> *rdata; PRINT(*rdata); std::cout <<"Give key for decryption: "; std::cin >> *rkey; std::cout <<"Give block size: "; std::cin >> BLOCK_SIZE; }
Muistialueen ylitys tapahtuu, kun "key" on annettu. neuvoja?
No eihän se virhe tietenkään tuossa näy vaan siellä, mistä tuota kutsut. Onko muistia ensinkään varattu? Onko sitä varattu tarpeeksi? Miksi edes käytät char-taulukoita, mikset käytä std::string-olioita?
stringiä en käytä, koska std::cin >> ei tallenna stringiin mitään välilyönnin jälkeen.
main näyttää tältä:
int main() { int choise; int BLOCK_SIZE = 0; char *raw_data[100]; char *raw_key [100]; std::cout <<"0) Read from line" <<std::endl; std::cout <<"1) Read from file" <<std::endl; std::cout <<"\nGive number: "; std::cin >> choise; if (choise) FromFile(raw_data, raw_key, BLOCK_SIZE); else FromLine(raw_data, raw_key, BLOCK_SIZE); std::string data(*raw_data); std::string key (*raw_key); std::cout <<"Before: " <<data <<std::endl; Xor(data, key, BLOCK_SIZE); std::cout <<"After: " <<data <<std::endl; std::ofstream File; File.open("after"); File <<data; File.close(); Xor(data, key, BLOCK_SIZE); std::cout <<"Back to \"" <<data <<"\"." <<std::endl; }
joo olen ehkä aika n00b vielä c++:ssa joidenkin asioiden kuten osoittimien suhteen :D
ja tuon aiemman esittely:
void FromLine(char *rdata[], char *rkey[], int &BLOCK_SIZE);
E: korjasin ongelman varaamalla FromLine-funktion alussa muistia noille osittimille, kuten Metabolix sanoi :D
vesikuusi kirjoitti:
stringiä en käytä, koska std::cin >> ei tallenna stringiin mitään välilyönnin jälkeen.
Huijaat nyt itseäsi. Täsmälleen samanhan se formatoitu lukeminen char-taulukollakin tekee. Jos haluat lukea kokonaisen rivin, sitä varten on std::getline, joka nimenomaan lukee rivin std::string-olioon. (Tämänkin tietäisit, jos vaivautuisit lukemaan C++-oppaastani merkkijonoja käsittelevän osuuden.)
vesikuusi kirjoitti:
main näyttää tältä:
... char *raw_data[100]; char *raw_key [100]; ...
Onneksi olkoon, olet siis varannut taulukon, jossa on sata kappaletta osoittimia. Ehkä kuitenkin viisaampaa olisi varata taulukko, jossa olisi sata merkkiä:
char taulukko[100];
Ja funktiolle riittää siinä tapauksessa char*-tyyppinen parametri, eikä ylimääräisiä *-merkkejä tarvita mihinkään.
Mutta suosittelen edelleenkin sitä string-oliota, kun on ilmeistä, ettet ole tuolla kikkailullasi saavuttanut kuin lisää bugeja.
kiitti Metabolix :) käytän kyllä stringiä aina, kun voin, mutta oman kokemuksen perusteella getline ei toimi string-olion kanssa..no katsotaan joskus :D
std::getline(std::cin, str)
toimii nimenomaan vain stringin kanssa.
aa itse tarkoitin std::cin.getline(...); :D en tiennytkään että std:ssä on kanssa tommonen funktio.. tajusin kanssa aikasemman viestisi kyseisen kohdan nyt :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.