Подтвердить что ты не робот

Что я должен использовать вместо sscanf?

У меня проблема, что sscanf решает (извлекает вещи из строки). Мне не нравится sscanf, хотя, поскольку он не безопасен по типу и является старым и ужасным. Я хочу быть умным и использовать некоторые более современные части стандартной библиотеки С++. Что я должен использовать вместо этого?

4b9b3361

Ответ 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