web-dev-qa-db-ja.com

sscanfの代わりに何を使用すればよいですか?

Sscanfが解決する(文字列から物事を抽出する)という問題があります。 sscanfはタイプセーフではなく、古くて恐ろしいので、私は好きではありません。私は賢くなり、C++標準ライブラリのより新しい部分を使用したいと思っています。代わりに何を使用すればよいですか?

26
Ben Hymers

試してください std::stringstream

#include <sstream>

...

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

ほとんどのジョブでは、標準ストリームが完全にジョブを実行します。

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を検討することもできます。

6
AraK

sstreamを含めると、文字列のストリームを提供するstringstreamクラスにアクセスできるようになります。これが必要です。 Roguewaveにはいくつかの良い点があります 使用方法の例

2
Kaleb Pederson

本当にストリームを使用したくない場合(読みやすさの点で優れています)、StringPrintfを使用できます。

その実装はFollyにあります。

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

0
iampat