To nie jest proste zadanie dla strumieni wejściowych w C++, aby zrobić to samo. Funkcja scanf
otrzymuje oczekiwany format: "%d %*s %d"
i może patrzeć w przyszłość, aby ustalić, co się dzieje. Z kolei operator >>
próbuje usatysfakcjonować bieżący parametr wejściowy.
Masz szanse na napisanie własnego manipulatora istream do jedzenia danych wejściowych, aż do osiągnięcia cyfry.
Spróbuj mój kod naiwny:
template<typename C, typename T>
basic_istream<C, T>&
eat_until_digit(basic_istream<C, T>& in)
{
const ctype<C>& ct = use_facet <ctype<C>> (in.getloc());
basic_streambuf<C, T>* sb = in.rdbuf();
int c = sb->sgetc();
while (c != T::eof() && !ct.is(ctype_base::digit, c))
c = sb->snextc();
if (c == T::eof())
in.setstate(ios_base::eofbit);
return in;
}
int main()
{
int first, second;
cin >> first >> eat_until_digit >> second;
cout << first << " : " << second << endl;
}
można rozszerzyć i poprawić powyższy kod, aby osiągnąć to, czego potrzebujesz.
+1 Brzmi rozsądnie! ^^ A co powiesz na zestaw przeskoków, takich jak 'std :: ios :: skip :: str',' std :: ios :: skip :: dec', a nawet 'std :: ios :: skip :: any'? Zbyt brudny? (: – Rubens
@Rubens: Zobacz moją zaktualizowaną odpowiedź, druga część: – deepmax
Czy nie 'std :: ctype :: scan_is' to zrobię? – 0x499602D2