我该怎么用而不是sscanf?

时间:2009-06-23 15:14:19

标签: c++ scanf c++-standard-library

我有一个sscanf解决的问题(从字符串中提取东西)。我不喜欢sscanf,因为它不是类型安全的,而且是古老而可怕的。我想要聪明并使用C ++标准库的一些更现代的部分。我该怎么用?

5 个答案:

答案 0 :(得分:38)

尝试std::stringstream

#include <sstream>

...

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

答案 1 :(得分:6)

对于大多数工作来说,标准流可以完美地完成工作,

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中的Spirit。

答案 2 :(得分:2)

如果包含sstream,您将可以访问为字符串提供流的字符串流类,这正是您所需要的。 Roguewave有一些好examples on how to use it.

答案 3 :(得分:0)

如果你真的不想使用流(因为可读性而很好),你可以使用 StringPrintf。

你可以在Folly中找到它的实现:

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

答案 4 :(得分:-1)

fgets或strtol