2017-02-07 3 views
2

cin >> *integerVar >> *charVar; kann Eingaben wie "25 b" korrekt lesen. Was ist der einfachste Weg, dies mit einer vorhandenen Zeichenfolge zu tun (ich kann es manuell tun, indem ich jeden Teil aufspalte und dann analysiere, aber was ist der bessere Weg)?Wie analysiert man eine Zeichenfolge zu mehreren Typen in C++?

+4

'std :: string Parser („Meine Quelle string“);' jetzt können Sie 'parser' benutzen, um genau die gleiche Art und Weise Sie' cin'. Dokumentation: http://en.cppreference.com/w/cpp/io/basic_stringstream – user4581301

+0

Warum verwenden Sie Zeiger? Die C++ - Sprache ist nicht C# oder Java; Sie müssen den Operator "new" nicht für jede Variable oder Instanz verwenden. –

Antwort

6

eine istringstream verwenden, wie zum Beispiel:

#include <string> 
#include <sstream> 

int main(void) 
{ 
    std::istringstream ss("25 b"); 
    int x; std::string bstr; 

    ss >> x >> bstr; 

    return 0; 
} 

// note that std:istringstream allows ss >> x, but not ss << "some value". 
// if you want to support both reading and writing, use a stringstream (which would then support ss >> x as well as ss << "some value") 
+1

Sollten wir 'istringstream' nicht als spezialisiertere Klasse verwenden? – HolyBlackCat

+0

@HolyBlackCat: Ich denke 'istringstream' drückt die Absicht besser aus, wenn du nur lesen willst, aber' stringstream' funktioniert auch. –

+0

@HolyBlackCat: Ja, das wäre besser; korrigierte die Antwort; danke für den Kommentar. –

4

können Sie verwenden, um die stringstream und string (Template) Klassen:

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

int main() { 
    std::string s; 
    std::getline(std::cin, s); 
    std::stringstream ss(s); 
    int n; 
    char c; 
    ss >> n >> c; 
    return 0; 
} 
5

von std::stringstream mit:

std::stringstream myStr{"25 b"}; 
myStr >> *integerVar >> *charVar; 
0

Sie kann sscanf verwenden, die tun es genau das gleiche wie scanf verwendet aber eine Zeichenfolge anstelle von STD Eingang

#include<iostream> 
#include<stdlib> 
#include<stdio> 
int main(){ 
    std::string str; 
    char character; 
    int intnumber; 
    cin >> str; 
    sscanf (str.c_str(), "%d%c", &intnumber, &character); 
} 
+0

Besser geben Sie ein Beispiel, weil dies erfordert ein bisschen Massieren eines 'string' zu arbeiten und' scanf' und Freunde sind notorisch blind, wenn es darum geht, die falschen Datentypen gefüttert zu werden. – user4581301

+0

@ user4581301 so etwas in Ordnung? – ZioCain

+0

Ziemlich nah. Empfehlen Sie anstelle von 'char *' für 'str',' char' anstelle von 'char *' für 'zeichen' und' sscanf (str.c_str(), "% d% c ", & inNumber, & Zeichen);' auf dem Anruf. weil Sie sonst einige nicht initialisierte Zeiger verwenden (und eine zusätzliche Adressierungsstufe beim Aufruf). – user4581301

Verwandte Themen