C ++ cinとC sscanf

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

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

だから、私の質問は、私はC + +で同じことをすることができますか?おそらくstringstreamを使用していますか?

3

3 答え

#include 
#include 

static void cmd_test(const char *s)
{
    std::istringstream iss(s);
    std::string dummy;
    int d = maxdepth;
    iss >> dummy >> d;
}
5
追加された

匿名の文字列を実際に抽出することはできませんが、ダミーを作成して無視するだけで済みます。

#include 
#include 
// #include //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
}

条件付きで入力すると、抽出が失敗する可能性があることに注意してください。エラーが発生した場合の処理​​は、あなた次第です。実際の関数がエラーを既に伝えている場合は、単にエラーを返すことができるかもしれませんが、C ++の例外は例外をスローすることです。

使用例:

#include 
#include 

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);
}
3
追加された
@ChristianRau:誰が知っている... OPは文字列ストリームに関するケースにあるようだが、おそらく彼はすでにストリームがどこかにある。必要であれば、 const char * から構築することもできます。私はコメントを追加しました。
追加された 著者 Kerrek SB,
@ChristianRau:良いアイデア、私はそれを変更しました!
追加された 著者 Kerrek SB,
おそらく、 const char * から istringstream への引数の変更は少し重いでしょうか?
追加された 著者 Christian Rau,
良い点ですが、私は実際にストリーム引数も好きです。しかし、この場合、一般的なアイスクリームはさらに良くなるでしょう。
追加された 著者 Christian Rau,
@KerrekSBしかし、今や変化は本当に重いです。 char *や文字列しか持たないときにこの関数を呼び出す方法を例に示すこともできます(ヘッダをistreamに変更することもできます)。
追加された 著者 Christian Rau,
+1はエラー処理に言及しています。
追加された 著者 ildjarn,

何について:

#include 
#include 

static void cmd_test(const std::string &s)
{
    int d = maxdepth;
    std::string dont_care;
    std::istringstream in(s);
    in >> dont_care >> d;
}
1
追加された