Странное поведение - PullRequest
       20

Странное поведение

0 голосов
/ 02 апреля 2020

Я не знаю, действительно ли это странно или это так, как должно быть, но вот моя настоящая борьба. Предположим, у нас есть что-то вроде:

stringstream sso("12 1442 nana 7676");
double num = 0;
while(sso >> num || !sso.eof()) {
    if(sso.fail()) {
        sso.clear();
        string dummy;
        sso >> dummy;
        continue;
    }
    cout << num << endl;
}

В результате:

12
1442
7676

, как и ожидалось. Но если я, например, изменю строковый литерал на 12 + 1442 nana 7676, то получу:

12
7676

Почему персонаж '+' запутывает все здесь?

1 Ответ

1 голос
/ 03 апреля 2020

Как мы теперь знаем, + является действительным токеном для double, поэтому вам нужен способ пропустить до следующего разделенного пробелами токена вместо того, чтобы просто избавиться от него. Эта функция может сделать это для вас:

template<class Ct>
std::basic_istream<Ct>& next_token(std::basic_istream<Ct>& is) {
  is.clear();
  std::ctype<Ct> const& ctype = std::use_facet<std::ctype<Ct>>(is.getloc());
  if (ctype.is(ctype.space, is.peek())) {
    return is >> std::ws;
  }
  Ct c;
  while (is.get(c) && !ctype.is(ctype.space, c)) {
    ;
  }
  return is;
}

Затем вы можете изменить свой код на:

stringstream sso("12 + 1442 nana 7676");
double num = 0;
while (sso) {
  if (!(sso >> num)) {
    sso >> next_token;
  } else {
    cout << num << endl;
  }
}

Вывод:

12
1442
7676
...