2009-06-23 77 views
24

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

+2

はなぜ「賢い」であることを試してみてください。

あなたはフォリーでの実装を見つけることができますか? –

+11

たとえば、彼は、sscanfはタイプセーフではないと言ったからです。 – jalf

+5

@Kaleb Pederson:多くの英語の話者にとって、「賢い」とは単に「スマート」を意味するだけで、時には米国での否定的な意味合いを持ちません。 Ben Hymersは英国出身です。 – 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();そうでなければdidnt_have_a_and_b(); '。 –

-1

fgetsまたはstrtol

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 
} 

、完璧に仕事をしています。

0

実際にストリームを使用したくない場合(可読性のために良いです)、 StringPrintfを使用できます。

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

+0

素敵なコードです(私はすでに同じものを使っています)。しかし、 'sscanf'ではなく' printf'の代わりです。 –

関連する問題