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. –
- 1. com.google.appengine.repackaged * yerine ne kullanmalıyım?
- 2. Oturum yerine ne kullanmalıyım?
- 3. Perl'de printf yerine ne kullanmalıyım?
- 4. Kalıtım yerine şablonları ne zaman kullanmalıyım?
- 5. RequestStack ne zaman getCurrentRequest yerine getMasterRequest kullanmalıyım?
- 6. DataContract yerine İleti Sözleşmelerini ne zaman kullanmalıyım ve neden?
- 7. Öğe "hizala" eski veya standart olmayan: bunun yerine ne kullanmalıyım?
- 8. Neden Thread yerine Runnable kullanmalıyım?
- 9. std :: bind ne zaman kullanmalıyım?
- 10. _aligned_malloc() işlevini ne zaman kullanmalıyım?
- 11. ImageButton veya Button'ı ne kullanmalıyım?
- 12. Git user.name için ne kullanmalıyım?
- 13. CGContextShowTextAtPoint kullanımdan kaldırıldı - şimdi ne kullanmalıyım?
- 14. C - sscanf çalışmıyor
- 15. django - media_root veya static_root'u ne zaman kullanmalıyım?
- 16. eval() yerine ne kullanabilirim?
- 17. Linux'ta dosya açtığımda O_CLOEXEC'i ne zaman kullanmalıyım?
- 18. JavaScript'te MVC framework'ü ne zaman kullanmalıyım?
- 19. @JoinColumn'u veya @JoinTable'ı Ne Zaman Kullanmalıyım?
- 20. QT projeleri ile ne kullanmalıyım? (QT Creator)
- 21. Birden çok görüntüyü saklamak için ne kullanmalıyım?
- 22. es6 Ok İşlevlerinde ne zaman 'return' kullanmalıyım?
- 23. Elixir is_range bekçisi tanımlanmadı mı? Ne kullanmalıyım?
- 24. C++ 14 Constexpr ne sıklıkla kullanmalıyım?
- 25. WCF hizmetinin içinde OperationContextScope'u ne zaman kullanmalıyım?
- 26. PHP: memory_get_peak_usage (false), ne zaman kullanmalıyım?
- 27. IE, height = auto resimleri desteklemiyor, ne kullanmalıyım?
- 28. Ne zaman Response.Redirect kullanmalıyım (url, true)?
- 29. Genel/özel/statik yöntemleri ne zaman kullanmalıyım?
- 30. SPATIAL INDEX nedir ve ne zaman kullanmalıyım?
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