Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++ Parametrit muuttujiin

Sivun loppuun

viljami [22.07.2010 07:48:58]

#

Mitenkähän ja millä olisi järkevintä toteuttaa konsolissa annetun parametrijonon parserointi? käsky näyttää siis seuraavalta "kasky 6 3 2000"

cout << "kasky host_port device_port delay: \n";
cin >> Host >> Device >> Delay;

Tällainen koodi on käytössä nyt, mutta käsky kaikkineen parametreineen pitäisi saada annettua samalla kerralla. Eli näin:

cout << "kasky host_port device_port delay: \n";
cin >> kasky;

Nyt pitäisi vaan saada tuo kasky pilkottua muuttujiin host_port, device_port ja delay katkaisumerkkinä siis välilyönti.

Jtm [22.07.2010 08:14:24]

#

Vastasit itse omaan kysymykseesi?

std::cout << "kasky host_port device_port delay:" << std::endl;

std::string kasky;
int host_port, device_port, delay;
std::cin >> kasky >> host_port >> device_port >> delay;

Ymmärtääkseni tuon pitäisi toimia (5 min miettimisen jälkeen).

Metabolix [22.07.2010 08:53:41]

#

Enpä minäkään ymmärrä, mikä tässä on olevinaan ongelma. Jos kuitenkin ideana on, että pitäisi pystyä helposti lukemaan myös puutteellisia tai virheellisiä komentoja ja ilmoittamaan niistä, yksi ratkaisu on rivin lukeminen getline-funktiolla ja stringstreamien käyttö.

#include <string>
#include <sstream>
#include <iostream>

int main() {
  std::string str;
  std::cout << "Anna merkki ja luku, esim. A 25: ";
  if (std::getline(std::cin, str) && str.length() > 0) {
    std::istringstream syote(str);
    char a;
    int b;
    if (syote >> a >> b) {
      std::cout << "Hienoa, annoit " << a << " " << b << "!" << std::endl;
    } else {
      std::cout << "Taidatpa olla melkoinen tyhmyri!" << std::endl;
    }
  }
}

viljami [22.07.2010 08:59:20]

#

Siis teoriassa tuo minun kysymys ja "vastaus" toimii. Eli myös Jtm, tuo sinun koodi näytti toimivan. Mutta tässä parametrit annetaan jokaiseen muuttujaan erikseen. Eli siis jokaisen parametrin jälkeen paramerti "kirjoitetaan" muuttujaan enterillä.

Tavoite siis olisi kirjoittaa käskyrivi näin: "kasky 6 3 2000". Kun nyt hyväksyn tämän enterillä, niin parametrit olisi luettavissa muuttujista seuraavalla tavalla:

kasky = kasky
host_port = 6
device_port = 3
delay = 2000

Toivottavasti selvensi...

Metabolix [22.07.2010 09:10:01]

#

Kyllähän ne voi noin syöttää. Oletko edes kokeillut?

viljami [22.07.2010 09:43:27]

#

Hmm, näköjään toimii!

Jostakin syystä tässä on vielä ongelmaa:

char command;
int Host, Device, Delay;
cout << "kasky host_port device_port delay: \n";
cin >> command >> Host >> Device >> Delay;

jos annan käskyksi "5 2 4 3000" niin homma toimii. Mutta jos annan käskyksi "start 2 4 3000" niin konsoli alkaa tulostamaan "kasky host_port device_port delay:" -riviä ihan hullun lailla...

Oonkohan vähän väsyny, kun en nyt taas tajua....

Teuro [22.07.2010 10:07:20]

#

Tarkista minkälainen muuttuja char on se != char*

Metabolix [22.07.2010 10:08:38]

#

Oikea tyyppi charin paikalle olisi std::string, jota jo aiemmin neuvottiin käyttämään.

viljami [22.07.2010 10:21:12]

#

Luonnollisesti. Nyt toimii oikein hienosti, juuri niinkuin pitääkin. Kiitos oikein kovasti kaikille!


Sivun alkuun

Vastaus

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

Tietoa sivustosta