2016-05-14 15 views
-3

So habe ich das nächste Problem, ich habe versucht, zwei Zeichenfolgen zu imitieren, eins kann null sein, andere müssen sein. Ich versuchte mitcin/getline in einer Zeile in der Konsole App

cin>> param1>>param2 

Beachten Sie, dass param1 nicht Null sein kann param 2 kann null sein. Funktioniert nicht, wenn Param2 null ist.

Als nächstes habe ich versucht mit getline(cin,param1) und getline(cin,param2) dies funktioniert, aber ich muss Params in zwei Zeilen in der Konsole App geben.

Ich muss von Konsole Param1, Param2 in einer einzigen Zeile lesen. Bitte beachten Sie, dass ich Anfänger mit dieser Programmiersprache bin.

Dank

+0

Warum sagen Sie "So habe ich das nächste Problem" in jedem einzelnen Ihrer Fragen? Wie ist das für eine der Fragen relevant? –

Antwort

1

Ja, das nicht funktioniert, weil cin dann für den zweiten Parameter wartet. Sie müssten getline() verwenden und die Zeichenfolge manuell analysieren.

Eine Möglichkeit, dies zu tun:

string params, param1, param2; 
getline(cin, params); 
istringstream str(params); 
str >> param1 >> param2; 

Beachten Sie, dass die param2 dann leer sein, wenn nur ein param bestanden, weil die string Ende (cin nicht zu Ende).

aber sagen, dass dies funktionieren wird, noch nicht für Fälle wie "parameter 1 with spaces" "parameter 2 with spaces" weil istream einfach auf die Felder aufteilt und behandelt nicht zitiert.

Normalerweise, wenn die Anwendung benötigt Parameter, argc und argv Argumente von main() werden verwendet, um sie aus der Anwendung Befehlszeile zu erhalten (wobei die Angabe funktioniert auch)

2

cin zum Lesen ist, so Strömungsrichtung ist umgekehrt:

cin >> param1 >> param2; 
+0

Ich modifizierte, sorry, ich hatte es eilig – lolex

1

cin ein Modell eines std::istream ist. Bei jedem istream ist das Ergebnis stream >> x ein Verweis auf die istream selbst.

Die istream enthält einige Flags, die den Erfolg oder Misserfolg der vorherigen Operationen anzeigen.

istream ist auch umwandelbar zu bool. Der Wert des bool wird true sein, wenn die vorherigen Operationen erfolgreich waren und andernfalls (aus irgendeinem Grund) falsch waren.

Also, wenn wir wollen, können wir nicht nur die >> Operationen sondern auch andere Prüfungen verketten.

Dies könnte ein wenig fortgeschritten sein, aber ich denke, dass Sie es interessant finden werden. Sie können dieses Programm kompilieren und ausführen, wie es ist.

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


struct success_marker 
{ 
    success_marker(bool& b) 
    : _bool_to_mark(std::addressof(b)) 
    {} 

    void mark(bool value) const { 
     *_bool_to_mark = value; 
    } 
    bool* _bool_to_mark; 
}; 

std::istream& operator>>(std::istream& is, success_marker marker) 
{ 
    marker.mark(bool(is)); 
    return is; 
} 

success_marker mark_success(bool& b) { 
    return success_marker(b); 
} 

void test(const std::string& test_name, std::istream& input) 
{ 
    bool have_a = false, have_b = false; 
    std::string a, b; 

    input >> std::quoted(a) >> mark_success(have_a) >> std::quoted(b) >> mark_success(have_b); 

    std::cout << test_name << std::endl; 
    std::cout << std::string(test_name.length(), '=') << std::endl; 
    std::cout << have_a << " : " << a << std::endl; 
    std::cout << have_b << " : " << b << std::endl; 
    std::cout << std::endl; 
} 

int main() 
{ 
    std::istringstream input("\"we have an a but no b\""); 
    test("just a", input); 

    // reset any error state so the stream can be re-used 
    // for another test 
    input.clear(); 

    // put new data in the stream 
    input.str("\"the cat sat on\" \"the splendid mat\""); 
    // test again 
    test("both a and b", input); 

    return 0; 
} 

erwartete Ausgabe:

just a 
====== 
1 : we have an a but no b 
0 : 

both a and b 
============ 
1 : the cat sat on 
1 : the splendid mat