2011-10-27 8 views
3

これはCで書かれているので、sscanfはsをスキャンしますが、それを破棄してdをスキャンして保存します。したがって、入力が「Hello 007」の場合、Helloはスキャンされますが破棄され、007がdに格納されます。C++ cin対C sscanf

static void cmd_test(const char *s) 
{ 
    int d = maxdepth; 
    sscanf(s, "%*s%d", &d); 
} 

私の問題は、同じことをC++でどうやって行うことができるかということです。おそらくstringstreamを使用していますか?

答えて

5
#include <string> 
#include <sstream> 

static void cmd_test(const char *s) 
{ 
    std::istringstream iss(s); 
    std::string dummy; 
    int d = maxdepth; 
    iss >> dummy >> d; 
} 
1

何について:

#include <string> 
#include <sstream> 

static void cmd_test(const std::string &s) 
{ 
    int d = maxdepth; 
    std::string dont_care; 
    std::istringstream in(s); 
    in >> dont_care >> d; 
} 
3

あなたが本当に匿名の文字列に抽出することはできませんが、あなただけのダミーを作り、それを無視することができます

#include <string> 
#include <istream> 
// #include <sstream> // see below 

void cmd_test(std::istream & iss) // any std::istream will do! 
{ 

    // alternatively, pass a `const char * str` as the argument, 
    // change the above header inclusion, and declare: 
    // std::istringstream iss(str); 

    int d; 
    std::string s; 

    if (!(iss >> s >> d)) { /* maybe handle error */ } 

    // now `d` holds your value if the above succeeded 
} 

注抽出ことあなたがエラーの場合にあなたがすることはあなた次第です。実際の関数がすでにエラーを通知している場合は、エラーをただちにreturnにすることができますが、C++の例外は例外をスローすることです。

使用例:

#include <iostream> 
#include <fstream> 

int main() 
{ 
    cmd_test(std::cin); 

    std::ifstream infile("myfile.txt"); 
    cmd_test(infile); 

    std::string s = get_string_from_user(); 
    std::istringstream iss(s); 
    cmd_test(iss); 
} 
+0

はたぶん 'istringstream'に'のconstのchar * 'からの引数の変化は少し重いのですか? –

+0

+1はエラー処理に言及しています。 – ildjarn

+0

@ChristianRau:誰かが知っている... OPはストリングストリームに関するケースにあるようだが、おそらく彼はすでにストリームがどこかにある。あなたが好きな場合は、 'const char *'で構築することはできません。私はコメントを追加しました。 –