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?
cevap
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;
c değil, örneğin "123 456" dize olup olmadığını bilmek nasıl? – unludo
@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ı. –
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(); '. –
fgets ya strtol
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.
sahiptir daha karmaşık ayrıştırma için daha güçlü araçlar gerekiyorsa, o zaman Boost Regex hatta Ruh düşünebilir.
Akışları gerçekten kullanmamak istiyorsanız (Okunabilirlik nedeniyle iyidir), StringPrintf'i kullanabilirsiniz.
https://github.com/facebook/folly/blob/master/folly/String.h#L165
Güzel bir kod (neredeyse aynı olan bir şey kullanıyorum), bunun yerine "printf" yerine "sscanf" yerine geçmesi gerekiyor. –
Neden "akıllı" olmaya çalışın:
Sen Deliliğe içinde uygulanmasını bulabilirim? –
Örneğin dediği için, sscanf tipi güvenli değildir. – jalf
@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