2009-06-23 15 views
24

Sscanf'ın çözdüğü bir sorun var (bir dizeden şeyler ayıklamak). Sscanf'ı sevmiyorum, çünkü güvenli ve eski ve korkunç değil. Zeki olmak ve C++ standart kütüphanesinin daha modern parçalarını kullanmak istiyorum. Bunun yerine ne kullanmalıyım?sscanf yerine ne kullanmalıyım?

+2

Neden "akıllı" olmaya çalışın:

Sen Deliliğe içinde uygulanmasını bulabilirim? –

+11

Örneğin dediği için, sscanf tipi güvenli değildir. – jalf

+5

@Kaleb Pederson: Birçok İngilizce konuşmacı için "zekice" yalnızca "akıllı" anlamına gelebilir ve ABD'de bazen sahip olduğu olumsuz anlamlara sahip değildir. Ben Hymers'ın İngiltere'den geldiğini unutmayın. – Naaff

cevap

36

diğer cevaplar noktası eksik olduğunu düşünüyorum. Soru I/O ile ilgili değil, bir dizeden veri ayıklamakla ilgili.

deneyin stringstream: Eğer sstream eklerseniz

#include <sstream> 

... 

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

c değil, örneğin "123 456" dize olup olmadığını bilmek nasıl? – unludo

+0

@unludo: Bu durumda, 'c' değiştirilemezdi. Öntanımlı bir değerle "c" yi başlatabilir veya daha karmaşık ayrıştırma yapmanız gerekebilir. Bir tokenizer muhtemelen işe yarayacaktı. –

+1

C++ 11'den itibaren, 'c', 0'a sıfırlanacak ve bundan önce hata sonrası değerinin tanımlanmamış olduğuna inanıyorum. Her neyse, c' olup olmadığını kontrol etmek için akış durumu kullanılır (rahatlık için, operatör bool() 'dan): eğer (s >> a >> b) ise, eğer (s >> c) abc_there(); else ab_there(); başka didnt_have_a_and_b(); '. –

-1

fgets ya strtol

2

neye ihtiyacınız olan dizeleri akışları sağlamak stringstream sınıflara erişebileceksiniz. Roguewave

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 
} 

, standart akışları mükemmel bir iş yapmak çoğu işler için bazı iyi examples on how to use it.

5

sahiptir daha karmaşık ayrıştırma için daha güçlü araçlar gerekiyorsa, o zaman Boost Regex hatta Ruh düşünebilir.

İlgili konular