Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: miksi tulee virheilmoitus? C++

mkaue [17.07.2008 14:09:50]

#

Moro!

Heti alkuun pyydän anteeksi otsikkoa joka ei valota kysymystä mitenkään.
Ongelmani on kuitenkin seuraavanlainen. Käytän koodieditorina Dev-c++.

Kun yritän tallentaa käyttäjän antaman nimensä cinin avulla muuttujaan niin tulee windowsin virheilmoitus jostain kumman syystä. Mutta esim. ikää kysyttäessä eli silloinkun muuttuja tyyppi on int niin koodi kyllä toimii.

Tässä vähän koodia jota en saa toimimaan:

#include <iostream>



using namespace std;


int main()
{
    char* nimi;

    cout<< "Anna nimesi: "<<endl;
    cin >> nimi;

    return 0;

}

Dev-c++ tarkka versio on 4.9.9.2

vehkis91 [17.07.2008 14:23:43]

#

Pistä

#include <iostream>
#include <string>


using namespace std;


int main()
{
    string nimi;

    cout<< "Anna nimesi: "<<endl;
    getline(cin, nimi); //Luetaan koko rivi, näin saa myös laitettua välilyönnit...

    cin.get(); //ettei ohjelma heti sammu
    return EXIT_SUCCESS;

}

Edit: näin siis c++...

Metabolix [17.07.2008 14:29:52]

#

Tyyyppi char* on pelkkä osoitin. Se siis vain sisältää tiedon, missä kohti muistia data sijaitsee. Mitään dataa et ole varannut, ja osoitinkin on alustamatta. Se voi siis osoittaa mihin tahansa kohti muistia, jonnekin, minne ohjelmallasi ei ole oikeutta kirjoittaa.

Suositeltavinta on käyttää valmista string-luokkaa, kuten vehkis91 esimerkissään. (Tuo getline-funktio ei silti ole tarpeen, vaan voit lukea myös >>-operaattorilla.) Toinen vaihtoehto on taulukko:

char nimi[100];
cin >> nimi;

Tässä tavassa on kuitenkin vaaransa: Jos käyttäjä syöttää niin pitkän nimen, ettei se mahdu taulukkoon, ohjelmalle voi käydä yhtä kehnosti kuin omassa versiossasi. Esimerkissä taulukkoon mahtuu 100 tavua, siis 99 ASCII-merkkiä ja yksi ylimääräinen merkki, joka ilmoittaa, että teksti loppuu. (Tämän avulla teksti voi siis loppua jo kesken taulukon, siis vaikkapa kolmen merkin jälkeen.)

DrDeath [17.07.2008 16:50:37]

#

tai sitten osoittajalla:

char *nimi = new char[100];

vehkis91 [17.07.2008 17:39:49]

#

Tuossa tapauksessa pitää myös muistaa "poistaa" toi *nimi, koska muuten sen varaamaa muistia ei vapauteta ennen ohjelman loppua...

Edit: muistaakseni tämä tapahtuu : delete nimi; En oo 100% varma kun en ite noita new ja delete juttuja käytä.

Vastaus

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

Tietoa sivustosta