2016-04-08 5 views
0

Tasks geht so: Sie sollten Name, Preis, Betrag in einer Zeile eingeben und wenn Betrag nicht angegeben wird, sollte der Betrag standardmäßig sein 1. mein Problem ist: Sie sollten in so viele Zeilen eingeben, wie Sie zum Beispiel Typ, wenn Sie wollen: Affe 200 3 stingray 399 1C++ mehrere cin Standardwert, wenn nicht eingegeben, Hinzufügen zu einer Karte <string, Vektor <double>>

es funktioniert, aber wenn Sie Namen nennen und die Menge Preis sollte sein hinzugefügt, um die Karte mit der Menge 1, wenn eine nicht gegeben ist. Stattdessen springt ut zum nächsten und Sie geben einen String-Namen auf einem int ein und die Schleife knackt. Gibt es einen anderen Weg, dies zu tun?

#include <string> 
#include <map> 
#include <vector> 
int main(){ 
    map<string, vector<double>> vec; 
    string name; 
    double price; 
    double amount; 
    while(cin >> name >> price >> amount){ 
     vec[name] = {price , amount} 
    } 

return 0; 
} 
+0

So wie Sie es getan haben, muss der Benutzer die drei Felder eingeben, und der Betrag scheint optional zu sein. Sie müssen es lesen, als ob es eine einzelne Zeichenfolge ist, und es dann teilen - wenn Sie einen Betrag finden, gehen Sie Ihren Standardpfad. Wenn nicht, gehen Sie auf den alternativen Pfad. –

+0

okej, ich habe gelesen wie getline Befehl aber wie benutze ich es richtig in meiner Situation @LeonardoAlvesMachado – Jim

+0

lesen Sie in der Zeile in eine 'Zeichenfolge'. lade die 'string' in einen' stringstream' und analysiere dann die Daten. Wenn Sie ein Feld verpassen, wird der Stream in einen Fehlerzustand versetzt, und Sie wissen dann, ob der Betrag standardmäßig sein sollte oder nicht. – NathanOliver

Antwort

0

Ich löste mein eigenes Problem. Das ist meine Lösung und es funktioniert mit den Parametern, die ich in meiner Frage erwähnt habe.

Firstclass myclass; 
string item, data; 
vector<string> split_input; 

// reads in on line of string until ctrl-z/ctrl-d 
while(getline(cin, data)){ 
    stringstream str_stream(data); 
    // reading the values separate adding them to vector 
    while(str_stream >> item{ 
     split_input.push_back(item); 
    } 
    // if amount is not given 
    if(v.size() == 2){ 
     myclass.insert_data(split_input[0], stod(split_input[1]), 1.00); 
    } 
    // if if amount is given 
    else{ 
     myclass.insert_data(split_input[0], stod(split_input[1]), stod(split_input[2])); 
    } 
    // clearing the vector 
    split_input.clear(); 
} 
0

Try this:

#include <string> 
#include <map> 
#include <vector> 
#include <cctype> 

int main(){ 
    map<string, vector<double>> vec; 
    string name; 
    double price; 
    double amount; 
    int peek_; 

    do{ 
     amount = 1; 
     std::cin >> name >> price; 
     std::cin >> std::ws; //get rid of white space 
     int peek_ = cin.peek(); 
     if (std::isdigit(peek_)){ 
     std::cin >> amount; 
     } 
     vec[name] = {price , amount} 
    } while (peek_ != EOF) 

return 0; 
} 

Dies sollte Ihnen die allgemeine Idee geben. Überprüfen Sie auch here für weitere Informationen.

Hinweis: Ich schrieb dies auf dem Sprung, also habe nicht kompiliert oder getestet. Sie müssen vielleicht ein bisschen mit der Syntax spielen :)

Ich hoffe, dass hilft.

+0

Vielen Dank! Ich werde es ausprobieren! – Jim

+0

Ich versuchte, aber kann nicht einen Hang davon, ich musste delcare peek_ außerhalb der While-Schleife asweed als isdigit (c) wurden geändert, um isdigit (peek_), aber wenn ich mit der Menge der Linien glücklich bin, sollten Sie in der Lage sein zu beenden die Schleife mit Strg-D. und dann habe ich eine Funktion, die den Inhalt der Karte ausdrucken wird – Jim

+0

Meine schlechte, weiß nicht, was ich dachte, erklären 'peek_' in der Schleife lol –