2009-06-23 13 views
24

Mam problem, który rozwiązuje sscanf (wyodrębnianie elementów z łańcucha znaków). Nie lubię sscanf, ponieważ nie jest bezpieczny w użyciu i jest stary i okropny. Chcę być sprytny i korzystać z bardziej nowoczesnych części standardowej biblioteki C++. Co powinienem zamiast tego użyć?Co powinienem użyć zamiast sscanf?

+2

Dlaczego staramy się być "mądry"? –

+11

Na przykład z tego powodu powiedział, że sscanf nie jest bezpieczny w użyciu. – jalf

+5

@ Kaleb Pederson: Dla wielu anglojęzycznych "sprytni" mogą oznaczać "inteligentne" i nie mają negatywnych konotacji, które czasami mają w USA. Pamiętaj, że Ben Hymers pochodzi z Wielkiej Brytanii. – Naaff

Odpowiedz

36

myślę pozostałe odpowiedzi brakuje punktu. Pytanie nie dotyczy I/O, chodzi o wydobywanie danych z łańcucha.

Spróbuj stringstream:

#include <sstream> 

... 

std::stringstream s("123 456 789"); 
int a, b, c; 
s >> a >> b >> c; 
+0

jak się dowiedzieć, czy nie ma tam c, na przykład ciąg znaków brzmiał "123 456"? – unludo

+0

@unludo: W takim przypadku 'c' będzie niezmodyfikowane. Możesz zainicjować 'c' z wartością domyślną lub możesz potrzebować bardziej zaawansowanego analizowania. Prawdopodobnie zadziałałby tokenizer. –

+1

Od C++ 11, "c" zostanie zresetowane do "0", a wcześniej uważam, że jego wartość po awarii była niezdefiniowana. W każdym razie, aby sprawdzić czy 'c' jest tam użyj stanu strumienia (dla wygody, z' operatora bool() '):' if (s >> a >> b) if (s >> c) abc_there(); else ab_there(); else didnt_have_a_and_b(); '. –

2

Jeśli to sstream będziesz miał dostęp do klas stringstream które dostarczają strumienie na smyczki, czyli to, co trzeba. Roguewave ma jakąś dobrą examples on how to use it.

5

dla większości zadań standardowe strumienie wykonać zadanie doskonale

std::string data = "AraK 22 4.0"; 
std::stringstream convertor(data); 
std::string name; 
int age; 
double gpa; 

convertor >> name >> age >> gpa; 

if(convertor.fail() == true) 
{ 
    // if the data string is not well-formatted do what ever you want here 
} 

Jeśli potrzebujesz bardziej zaawansowane narzędzia do bardziej złożonej analizy składniowej, wtedy można rozważyć Regex lub nawet duch od doładowania.

Powiązane problemy