Moi. Olisi tämmöinen tehtävä, joka meikän pitäisi ratkaista.
Alla on hieman karsittu versio edellisestä ohjelmasta, mutta idea muuten sama. Ohjelmassa luodaan olio nimeltään "olio", joka on luokan "KysyJaTulosta" ilmentymä. Sinun tehtäväsi on laatia luokka "KysyJaTulosta" ja laatia luokkaan metodi TeeHommasi(), joka ottaa vastaan muuttujan "merkkijono" sisältämän merkkijonon, tulostaa muuttujan sisällön, lukee käyttäjän antaman syötteen ja tulostaa tämän näytölle. Palautuskenttään tulee kirjoittaa vain puuttuva luokka, alla olevaa koodia ei tarvitse kopioida. Valmiin ohjelman toiminnan näet esimerkkitulosteesta. Vihje: Käyttäjän antamassa syötteessä voi olla välilyöntejä, joten pelkkä cin >> merkkijono; ei riitä käyttäjän syötteen lukemiseen. #include <iostream> #include <string> using namespace std; // sinun koodisi tulee tähän int main (void) { char merkkijono[] = "Anna merkkijono, jonka tulostan:"; KysyJaTulosta olio; olio.TeeHommasi(merkkijono); } Example output Anna merkkijono, jonka tulostan:esimerkkituloste esimerkkituloste
Ja tämmöisen ratkaisun olen saanut tähän mennessä aikaiseksi :
class KysyJaTulosta { public: char merkkijono[]; void TeeHommasi(char merkkijono[]); }; void KysyJaTulosta::TeeHommasi(char merkkijono[]) { cout << merkkijono; cin.getline(merkkijono, '\n'); cout << merkkijono <<endl; }
Koodissa on semmoista vikaa, että minun tuotoksellani tuo tulostaa vain tekstin:
Anna merkkijono, jonka tulostan:esimerkkituloste esimerkki Kun sen taas pitäisi tulostaa tämä: Anna merkkijono, jonka tulostan:esimerkkituloste esimerkkituloste
Jostain pikkuvirheestä tuo varmaankin johtuu, mutta en saa sitä millään mieleeni että miten tuon korjaisisi.
Monilla muilla ohjelmointikielillä tuo algoritminä varmasti toimisi, mutta ongelma lienee se että yrität tuohon parametriin lukea merkkijonoa. Määrittele siis uusi merkkijono-muuttuja toisella nimellä, jonka luet ja tulostat. Pitäähän sinun myös jotenkin määritellä kuinka monta merkkiä pystyy maksimissaan lukemaan, ellet käytä jotain String-tyyppiä.
Getline-operaatiosta on versio, joka lukee syötteen string-tyyppiseen muuttujaan. Se on kuvattu tällä sivulla, ja sen käytöstä on alempana esimerkki.
Sain ratkaistuksi. Ja tässä miten sen ratkaisin :
class KysyJaTulosta { public: char merkkijono[]; void TeeHommasi(char merkkijono[]); }; void KysyJaTulosta::TeeHommasi(char merkkijono[]) { cout << merkkijono; cin.get(merkkijono,100); cout << merkkijono <<endl;
Luokassa ei kuulu olla jäsenmuuttujaa, se on täysin turha.
Itse vika oli siinä, että käytetty funktio std::istream::getline ei ota toisena argumenttinaan lopetusmerkkiä vaan merkkijonon koon. Merkin '\n' ASCII-arvo on 10, jolloin funktio lukee vain yhdeksän merkkiä ("esimerkki") ja kymmenes merkki on lopetusmerkki. 100 on oikea argumentti. Lopetusmerkin voisi antaa kolmantena argumenttina, mutta se on automaattisesti '\n'.
Aihe on jo aika vanha, joten et voi enää vastata siihen.