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.
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).
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; } } }
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...
Kyllähän ne voi noin syöttää. Oletko edes kokeillut?
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....
Tarkista minkälainen muuttuja char on se != char*
Oikea tyyppi charin paikalle olisi std::string, jota jo aiemmin neuvottiin käyttämään.
Luonnollisesti. Nyt toimii oikein hienosti, juuri niinkuin pitääkin. Kiitos oikein kovasti kaikille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.