2009-10-31 18 views

cevap

2

scanf ve fscanf'a bakın. Sen * böyle bir şey yapmak mümkün olabilir:

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

* Uyarı: Bu bir benim için süre ve C++

+2

Doğru, C++ 's' istream :: operator >> 'yerine C'nin' scanf' kullanmak kesinlikle daha kolay. Sscanf (a.c_str(), "% d:% d:% d.% D", & h, & m, & s, & f) == 4' anlamına gelebilir. – ephemient

+0

Teşekkürler, bu pratik bir çözüm. – henle

+0

@ephemient Ya, bu o. Söylediğim gibi, C/C++ @henle 'e dokunduğumdan beri bir süre geçti. Eğer çözümünüz buysa, cevabını cevap arkadaş olarak işaretleyin;) –

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

Sana yaratmadan varsayılan sınırlayıcı değiştirebilir sanmıyorum oldu Yeni yerel ayar, ama bu hackish gibi görünüyor. Kullanabileceğiniz şey sınırlayıcı karakterini belirten üçüncü bir parametreyle getline kullanın veya sınırlayıcıları okuyabilir ve bunlarla hiçbir şey yapamazsınız (örn. Ss >> h >> d >> m >> d >> s >> d> > f).

Ayrıca, ayırma dizelerini sizin için işleyen kendi ayrıştırma sınıfınızı da yazabilirsiniz. Ya da daha iyisi, Boost'un String Algorithms Library numaralı telefonundan boost::split kullanın.

+0

"boost :: split" ve "getline" ile can sıkıcı olan şey dizeleri ayırmanız ve daha sonra – henle

+2

tam sayılarını almak için bir akışa geri beslemenizdir. "Boost :: split" işlevini kullanabilirsiniz. std :: string 'std :: string' vektörü ', 'std :: vector' std :: vector ' 'std :: vektör ' –

3

Bunu, boşluk olarak : olarak sınıflandıran bir ctype yönü olan bir yerel ayar oluşturarak yapabilirsiniz.

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

+0

Teşekkür ederim, bu benim soruma verilen cevaptır! Yine de bir rc [':'] = std :: ctype_base :: space yapıp yapamayacağınızı anlamaya çalışıyorum; Yepyeni bir yerel ayar oluşturmadan ... – henle

+1

Maalesef, ios_base, imbued yerel ayarı temel alarak karakterleri boşluk olarak sınıflandırdığından, başka seçeneklerin olduğunu sanmıyorum. Firas'ın boost :: split (veya alternatif olarak, boost :: tokenizer) önerisi muhtemelen bir sonraki en iyi bahistir. –

İlgili konular