C ++ Cin vs. C Sscanf - PullRequest
       37

C ++ Cin vs. C Sscanf

3 голосов
/ 28 октября 2011

Итак, я написал это на 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 ]

5 голосов
/ 28 октября 2011
#include <string>
#include <sstream>

static void cmd_test(const char *s)
{
    std::istringstream iss(s);
    std::string dummy;
    int d = maxdepth;
    iss >> dummy >> d;
}
3 голосов
/ 28 октября 2011

Вы не можете действительно извлечь в анонимную строку, но вы можете просто сделать пустышку и игнорировать ее:

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

Обратите внимание, что извлечение может завершиться неудачей, откуда я вставил условное выражение. Вам решать, что вы будете делать в случае ошибки; C ++ должен был бы генерировать исключение (хотя, если ваша фактическая функция уже сообщает об ошибках, вы можете просто return ошибка).

Пример использования:

#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);
}
1 голос
/ 28 октября 2011

А как же:

#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;
}
...