2009-10-31 10 views
6

Tak, że można zrobić coś takiego, na przykład:Czy możesz powiedzieć, które znaki traktować jako białe znaki?

std::string a("01:22:42.18"); 
std::stringstream ss(a); 
int h, m, s, f; 
ss >> h >> m >> s >> f; 

która zazwyczaj wymaga ciąg być sformatowany "01 22 42 18". Czy możesz zmodyfikować bieżące ustawienia regionalne bezpośrednio, aby to zrobić?

+0

Chyba nie możesz tego zrobić. Interesujące pytanie: +1 – AraK

Odpowiedz

2

Spójrz na scanf i fscanf. Możecie * być w stanie zrobić coś takiego:

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

* Zastrzeżenie: Minęło trochę czasu dla mnie i C++

+2

Dobrze, używając 'scanf' zamiast C' istream :: operator >> 'jest zdecydowanie łatwiejsze. Być może chodziło o 'sscanf (a.c_str(),"% d:% d:% d.% D ", & h, & m, & s, & f) == 4' choć. – ephemient

+0

Dzięki, to praktyczne rozwiązanie. – henle

+0

@ephemient Ya, to jest ta. Jak już mówiłem, minęło trochę czasu odkąd dotknąłem C/C++ @henle Jeśli to jest twoje rozwiązanie, a następnie oznacz go jako mate odpowiedzi;) –

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

Nie sądzę, można zmienić domyślny separator bez tworzenia nowe locale, ale wydaje się to hackish. To, czego możesz użyć, to użycie getline z trzecim parametrem określającym znak ogranicznika lub możesz odczytać ograniczniki i nic z nimi nie zrobić (np. Ss >> h >> d >> m >> d >> s >> d> > f).

Można również napisać własną klasę analizowania, która obsługuje podział na łańcuchy znaków. Albo jeszcze lepiej, użyj boost::split z Boost's String Algorithms Library.

+0

denerwujące z 'boost :: split' i' getline' jest to, że musisz podzielić łańcuchy, a następnie wprowadzić je z powrotem do strumienia, aby uzyskać liczby całkowite – henle

+2

Możesz użyć 'boost :: split' aby przekształcić 'std :: string' na' std :: vector ', następnie użyj' std :: transform' z 'boost :: lexical_cast', aby przekształcić' std :: vector 'na' std :: vector < unsigned int> ' –

3

Możesz to zrobić, tworząc ustawienia narodowe z aspektem ctype, klasyfikując : jako białą przestrzeń.

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

+0

Dziękuję, to byłaby dosłowna odpowiedź na moje pytanie! Chociaż próbuję dowiedzieć się, czy możesz po prostu zrobić rc [':'] = std :: ctype_base :: space; bez tworzenia zupełnie nowego locale ... – henle

+1

Niestety, ponieważ ios_base klasyfikuje znaki jako białe znaki w oparciu o nasycone ustawienia narodowe, nie sądzę, że są jakieś inne opcje. Sugestia fira :: boost :: split (lub alternatywnie boost :: tokenizer) jest prawdopodobnie twoim następnym najlepszym wyborem. –

Powiązane problemy