У меня проблема, что sscanf решает (извлекает вещи из строки). Мне не нравится sscanf, хотя, поскольку он не безопасен по типу и старый и ужасный. Я хочу быть умным и использовать некоторые более современные части стандартной библиотеки C++. Что я должен использовать вместо этого?Что следует использовать вместо sscanf?
ответ
Я думаю, что другие ответы не хватает точки. Вопрос не в I/O, а в извлечении данных из строки.
Try stringstream:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
как узнать, существует ли c, например, строка была «123 456»? – unludo
@unludo: В этом случае 'c' не будет изменен. Вы можете инициализировать 'c' значением по умолчанию, или вам может потребоваться более сложный синтаксический анализ. Возможно, работает токенизатор. –
Начиная с C++ 11, 'c' будет сброшен до' 0', и до этого я считаю, что его значение после сбоя не определено. В любом случае, чтобы проверить, используется ли 'c', используется состояние потока (для удобства, из' operator bool() '):' if (s >> a >> b) if (s >> c) abc_there(); else ab_there(); else didnt_have_a_and_b(); '. –
fgets или strtol
Если включить sstream
вы будете иметь доступ к классам stringstream, которые обеспечивают потоки строк, которые, что вам нужно. Roguewave имеет хорошие examples on how to use it.
Для большинства заданий стандартные потоки делают работу отлично,
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
}
Если вам нужны более мощные инструменты для более сложного синтаксического анализа, то вы могли бы рассмотреть Regex или даже Дух от Boost.
Если вы действительно не хотите использовать потоки (это хорошо из-за удобочитаемости), вы можете использовать StringPrintf.
Вы можете найти его реализацию в Фоли:
https://github.com/facebook/folly/blob/master/folly/String.h#L165
Хороший бит кода (я использую что-то почти то же самое уже), хотя это замена 'printf', а не' sscanf'. –
- 1. Что следует использовать вместо DS.FixtureAdapter
- 2. Что следует использовать вместо sun.net.www.protocol.jar.Handler?
- 3. Что следует использовать вместо сеанса?
- 4. Что следует использовать вместо LoadWithPartialName()?
- 5. Что следует использовать вместо clutter_score_new?
- 6. Что следует использовать вместо nltk.Text.generate()?
- 7. что следует использовать вместо readableStream.push ('')
- 8. Что следует использовать вместо isinstance()
- 9. Что следует использовать вместо Bootstrap?
- 10. Что следует использовать вместо FlowLayout()?
- 11. Что следует использовать вместо метода UseGoogleAuthentication (IAppBuilder)?
- 12. Что следует использовать вместо Select-AzureSubscription?
- 13. httpClient.getConnectionManager() устарел - что следует использовать вместо этого?
- 14. Что следует использовать вместо std :: ostrstream?
- 15. getPosition Устаревшие Что следует использовать вместо этого?
- 16. mysql - Что следует использовать вместо инструкции IN?
- 17. Что следует использовать вместо jsp: useBean?
- 18. Что следует использовать вместо printf в Perl?
- 19. использовать `sscanf` то же самое, что` istringstream`?
- 20. Что следует использовать вместо функций и типов объектов в потоке
- 21. Что следует использовать вместо устаревшего UISegmentedControlStyleBezeled в iOS5.1?
- 22. Что следует использовать вместо syncdb в Django 1.9?
- 23. Что следует использовать вместо SpringBootServletInitializer, устаревшего в 1.4.0.RELEASE
- 24. Что следует использовать вместо передачи по ссылке в R?
- 25. Что следует использовать вместо устаревшего GKLeaderboardViewController в iOS7?
- 26. Как правильно использовать sscanf
- 27. Что следует использовать для/HatchMap.get()?
- 28. Python: когда следует использовать subprocess.Popen вместо os.popen?
- 29. Swift: когда следует использовать «var» вместо «let»?
- 30. Когда следует использовать Boolean вместо boolean?
Почему пытаются быть "умным"? –
Например, по причине того, что он сказал, что sscanf не является безопасным для типа. – jalf
@ Kaleb Pederson: для многих говорящих на английском языке «умный» может просто означать «умный» и не имеет отрицательной коннотации, которую он иногда имеет в США. Обратите внимание, что Бен Хаймерс из Великобритании. – Naaff