Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Muistialueen ylitys

vesikuusi [08.07.2011 21:58:31]

#

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?

Metabolix [08.07.2011 22:22:05]

#

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?

vesikuusi [08.07.2011 22:30:35]

#

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

Metabolix [08.07.2011 22:59:41]

#

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.

vesikuusi [08.07.2011 23:31:31]

#

kiitti Metabolix :) käytän kyllä stringiä aina, kun voin, mutta oman kokemuksen perusteella getline ei toimi string-olion kanssa..no katsotaan joskus :D

Metabolix [09.07.2011 12:41:30]

#

std::getline(std::cin, str) toimii nimenomaan vain stringin kanssa.

vesikuusi [11.07.2011 00:35:15]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta