#include <iostream> using namespace std; #include <string> string buffer; void Getbuf() { cout << "\n-----\n" << ">"; cin >> buffer; cout << endl; return; } int main() { bool loop=1; while(loop) { Getbuf(); cout << buffer; if(buffer=="exit") loop=0; } return 0; }
Tässä ohjelma kysyy merkkijonoa. jos laitat jonoksi sanan esim. "moi", ohjelma printtaa sen ja kysyy seuraavaa. Mutta jos kirjottaa merkkijonoon "Olen viisas mies", ohjelma printtaa:
>Olen viisas mies
Olen
---
>
viisas
---
>
mies
sen sijaan, että:
---
Olen viisas mies
---
Eli käytännössä ensin cin ottaa ensimmäisen sanan ja seuraavalla kerralla kun cin kysyy sanaa, se ottaa automaattisesti seuraavan sanan mitä viimekerralla käyttäjä laitoi sen sijaan että kysyisi uutta.
Selitys saattoi olla sekava joten on helpointa koittaa itse.
http://zux.sjr.fi/touho/ohjelma.exe
Vastaus on melko yksinkertainen: cin:n >> -operaattori lukee puskurista yhden sanan, ei lausetta. Käytä koko rivin ottamiseen cinin getline()-funktiota (tai jotain sinnepäin...).
Toiseksi, älä koskaan vertaa merkkijonoja == -operaattorilla! Tällöin verrataan ainoastaan niiden osoitteita, ei sisältöjä. Käytä tähän strcmp()/stricmp()-funktioita.
löysin tämmösen:
/************************************** cin.getline example ***************************************/ #include <iostream.h> int main(void) { const SIZE = 100; char msg[SIZE]; cout<<"Enter a string."<<endl; cin.getline(msg,SIZE); cout<<"The sentence you entered was"<<endl; cout<<msg<<endl; return 0; }
cin.getline:n parameteissä tarvii muuttujan koon. Miten saan ilmotettua string-muuttujan koon?
Edit: Eikö string muuttujia juuri voinut verrata ==-operaattorilla ja char muuttujia strcmp:lla ja näillä..
getline ottaa toisena parametrinaan puskurin maksimikoon, eli syötettävän merkkijonon maksimipituuden. Se mitä äsken katsoin kääntäjän helpistä niin tuo getline näyttäisi olevan toiminnassa vain char-taulukoille (korjatkaa jos olen väärässä). Mutta voit toki koettaa, jos se toimisi myös string:llä.
Niin, kyse olikin string-luokasta eikä char*:stä... Anteeksi.
Stringien vertailu voidaan suorittaa esim. sen omalla isEqual()-funktiolla:
if(buffer.isEqual("exit")loop=0;
Mielestäni paras vaihtoehto string-luokan kanssa on käyttää muistaakseni std-nimiavaruudesta löytyvää metodia getline, joka ottaa parametrikseen istreamin ja merkkijonon. Jotain tähän tyyliin:
std::string tempstr; std::cout << "Annapa rivi, pituudella ei niin kamalasti väliä: "; std::getline(std::cin, tempstr);
Aihe on jo aika vanha, joten et voi enää vastata siihen.