2009-10-31 7 views

Antwort

2

Werfen Sie einen Blick auf scanf und fscanf. Sie könnten * in der Lage sein, so etwas zu tun:

int h, m, s, f; 
sscanf(a.c_str(), "%d:%d:%d.%d", &h, &m, &s, &f); 

* Caveat: Es ist für mich eine Weile her und C++

+2

Richtig, mit C '' scanf' statt C++ 's' itream :: operator >> 'ist definitiv viel einfacher. Sie haben vielleicht auch 'sscanf (a.c_str(),"% d:% d:% d.% D ", & h, & m, & s, & f) == 4' gemeint. – ephemient

+0

Danke, das ist eine praktische Lösung. – henle

+0

@ephemient Ya, das ist der eine. Wie ich schon sagte, es ist schon eine Weile her, dass ich irgendein C/C++ berührt habe. Wenn das deine Lösung ist, dann markiere es als Antwortpartner;) –

2
char c; 
if (!(ss >> h >> c) || c != ':') return; 
if (!(ss >> m >> c) || c != ':') return; 
if (!(ss >> s >> c) || c != '.') return; 
if (!(ss >> f) || ss >> c) return; 
5

Ich glaube nicht, dass Sie die Standardtrennzeichen ändern kann, ohne eine Erstellung neuer Ort, aber das scheint hackisch. Was Sie verwenden können, ist getline mit einem dritten Parameter zu verwenden, der das Trennzeichen angibt, oder Sie könnten die Trennzeichen lesen und nichts damit machen (zB ss >> h >> d >> m >> d >> s >> d>) > f).

Sie können auch Ihre eigene Parsing-Klasse schreiben, die die Teilung von Strings für Sie übernimmt. Oder noch besser, verwenden Sie boost::split von Boost String Algorithms Library.

+0

die nervige Sache mit 'boost :: split' und' getline' ist, dass du die Strings aufteilen und dann wieder in einen Stream füttern musst, um die ganzen Zahlen zu erhalten – henle

+2

Du kannst 'boost :: split' verwenden, um zu transformieren der 'std :: string' in einen' std :: vector ', dann benutze' std :: transform' mit 'boost :: lexical_cast', um den' std :: vector 'in einen' std :: vector ' –

3

Sie können dies tun, indem Sie ein Gebietsschema mit einer ctype-Facette erstellen, die : als Leerzeichen klassifiziert.

Jerry Coffin explains how you can specify whitespace characters in this answer to another question.

+0

Danke, das wäre die wörtliche Antwort auf meine Frage! Obwohl ich versuche herauszufinden, ob Sie einfach eine rc [':'] = std :: ctype_base :: space; ohne ein ganz neues Gebietsschema zu erstellen ... – henle

+1

Leider, da ios_base Zeichen als Leerzeichen basierend auf dem gebündelten Gebietsschema klassifiziert, glaube ich nicht, dass es andere Optionen gibt. Firas 'Vorschlag von boost :: split (oder alternativ boost :: tokenizer) ist wahrscheinlich Ihre zweitbeste Wahl. –

Verwandte Themen