2013-09-28 275 views
6

Với scanf ai được phép skip thẻ phù hợp, bạn chỉ cần thêm * để mô hình, như trong:Lờ đi/bỏ qua thẻ sử dụng std :: cin

int first, second; 
scanf("%d %*s %d", &first, &second); 

Có bất kỳ phương pháp tương đương với std::cin? Một cái gì đó như (tất nhiên, tiết kiệm việc sử dụng các biến bổ sung):

int first, second; 
std::cin >> first >> `std::skip` >> second; 

Trả lời

3

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.

+0

+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

+1

@Rubens: Xem câu trả lời cập nhật của tôi, phần thứ hai – deepmax

+0

Không 'std :: ctype :: scan_is' làm điều này? – 0x499602D2

3

Có thể bạn đang tìm kiếm C++ String Toolkit Library.

Kiểm tra này để biết thêm example

Hoặc bạn có thể thử với ignore chức năng như thế này:

std::cin >> val1; 
std::cin.ignore (1234, ' '); 
std::cin >> val3; 

Something như thế này: -

template <class charT, class traits> 
inline std::basic_istream<charT, traits> & 
ignoreToken (std::basic_istream<charT, traits> &strm) 
{ 
    strm.ignore (1234, ' '); 
    return strm; 
} 

Và sau đó sử dụng như:

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5; 
+0

Mặc dù nó có vẻ là lựa chọn duy nhất có sẵn từ stl, tôi đã mong đợi một cái gì đó một chút gọn gàng hơn. Một 'std :: ios :: skip :: str' và' std :: ios :: skip :: dec' và thậm chí 'std :: ios :: skip :: any' sẽ rất đẹp (: – Rubens

+0

@Rubens: - Điều đó có giúp ích gì không? –

+1

+1 Tôi không bao giờ có nghĩa là bài đăng của bạn không giúp được! ^^ Cảm ơn ví dụ chức năng! (: – Rubens

2

Bạn chỉ cần sử dụng biến giả

int first, second; 
std::string dummy; 
cin >> first >> dummy >> second; 

nhưng không có AFAIK tương đương trực tiếp.

+0

Vâng, đó là lý do tại sao tôi chỉ ra " * Tất nhiên, hãy bỏ qua việc sử dụng các vars bổ sung * "Tôi đang quen với ý tưởng này là giải pháp duy nhất, anyway \ = – Rubens

+0

@Rubens, xin lỗi đã bỏ lỡ điều đó. – john