У меня проблема, что sscanf решает (извлекает вещи из строки). Мне не нравится sscanf, хотя, поскольку он не безопасен по типу и является старым и ужасным. Я хочу быть умным и использовать некоторые более современные части стандартной библиотеки С++. Что я должен использовать вместо этого?
Что я должен использовать вместо sscanf?
Ответ 1
Я думаю, что в других ответах отсутствует точка. Речь идет не о I/O, а о извлечении данных из строки.
Попробуйте stringstream:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
Ответ 2
Для большинства заданий стандартные потоки выполняют работу отлично,
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 или даже Spirit from Boost.
Ответ 3
Если вы включите sstream
, у вас будет доступ к классам stringstream, которые предоставляют потоки для строк, что вам нужно. У Roguewave есть хорошие примеры того, как его использовать.
Ответ 4
Если вы действительно не хотите использовать потоки (это хорошо из-за удобочитаемости), вы можете использовать StringPrintf.
Вы можете найти его реализацию в Folly:
https://github.com/facebook/folly/blob/master/folly/String.h#L165
Ответ 5
fgets или strtol