Nó không phải là một nhiệm vụ đơn giản cho các luồng đầu vào trong C++ để làm điều tương tự. Chức năng scanf
nhận được tất cả định dạng mong đợi: "%d %*s %d"
và có thể xem trước để xác định điều gì đang diễn ra.
Mặt khác, toán tử >>
chỉ cố gắng đáp ứng tham số nhập hiện tại.
Bạn có cơ hội viết cho mình một trình xử lý istream để ăn đầu vào cho đến khi đạt đến chữ số.
Hãy thử điều này đang ngây thơ của tôi:
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;
}
Bạn có thể mở rộng và cải thiện trên mã để đạt được những gì bạn cần.
+1 Âm thanh hợp lý! ^^ một bộ bỏ qua, như 'std :: ios :: skip :: str',' std :: ios :: skip :: dec', và thậm chí 'std :: ios :: skip :: any'? Quá lộn xộn? (: – Rubens
@Rubens: Xem câu trả lời cập nhật của tôi, phần thứ hai – deepmax
Không 'std :: ctype :: scan_is' làm điều này? – 0x499602D2