Что я должен использовать вместо sscanf? - PullRequest
26 голосов
/ 23 июня 2009

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

Ответы [ 5 ]

38 голосов
/ 23 июня 2009

Попробуйте std::stringstream:

#include <sstream>

...

std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
6 голосов
/ 24 июня 2009

Для большинства рабочих мест стандартные потоки отлично справляются с работой,

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
}

Если вам нужны более мощные инструменты для более сложного синтаксического анализа, вы можете рассмотреть регулярное выражение или даже Spirit из Boost.

2 голосов
/ 23 июня 2009

Если вы включите sstream, у вас будет доступ к классам stringstream, которые предоставляют потоки для строк, что вам и нужно. У Roguewave есть несколько хороших примеров того, как его использовать.

0 голосов
/ 07 августа 2013

Если вы действительно хотите не использовать потоки (это хорошо из-за читабельности), вы можете использовать StringPrintf.

Вы можете найти его реализацию в Folly:

https://github.com/facebook/folly/blob/master/folly/String.h#L165

0 голосов
/ 23 июня 2009

fgets или strtol

...