Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: cin:n käyttöä

Touho [12.05.2005 19:20:05]

#

#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

sqwiik [12.05.2005 19:39:21]

#

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.

Touho [12.05.2005 20:20:32]

#

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ä..

sqwiik [12.05.2005 21:12:02]

#

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;

uffis [14.05.2005 23:40:28]

#

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);

Vastaus

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

Tietoa sivustosta