2009-06-23 5 views
24

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

+2

Почему пытаются быть "умным"? –

+11

Например, по причине того, что он сказал, что sscanf не является безопасным для типа. – jalf

+5

@ Kaleb Pederson: для многих говорящих на английском языке «умный» может просто означать «умный» и не имеет отрицательной коннотации, которую он иногда имеет в США. Обратите внимание, что Бен Хаймерс из Великобритании. – Naaff

ответ

36

Я думаю, что другие ответы не хватает точки. Вопрос не в I/O, а в извлечении данных из строки.

Try stringstream:

#include <sstream> 

... 

std::stringstream s("123 456 789"); 
int a, b, c; 
s >> a >> b >> c; 
+0

как узнать, существует ли c, например, строка была «123 456»? – unludo

+0

@unludo: В этом случае 'c' не будет изменен. Вы можете инициализировать 'c' значением по умолчанию, или вам может потребоваться более сложный синтаксический анализ. Возможно, работает токенизатор. –

+1

Начиная с 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(); '. –

2

Если включить sstream вы будете иметь доступ к классам stringstream, которые обеспечивают потоки строк, которые, что вам нужно. Roguewave имеет хорошие examples on how to use it.

5

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

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.

0

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

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

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

+0

Хороший бит кода (я использую что-то почти то же самое уже), хотя это замена 'printf', а не' sscanf'. –

Смежные вопросы