2013-09-28 136 views
6

隨着scanf一個被允許跳過匹配令牌,簡單地增加*到圖案,如在:忽略/跳過令牌:: CIN

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

是否與std::cin任何等效方法?喜歡的東西(當然,節約其他變量的使用):

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

回答

3

對於C++中的輸入流來說,做同樣的事情並不是一項簡單的任務。函數scanf獲取所有預期格式:"%d %*s %d",並可以展望未來以確定發生了什麼。

另一方面,運營商>>只是試圖滿足當前的入口參數。


你有機會寫你自己的istream機械手吃輸入,直到達到一個數字。

試試這個我天真代碼:

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

您可以擴展和改善上面的代碼來實現你所需要的。

+0

+1聽起來很合理!^^一組跳過,如'std :: ios :: skip :: str','std :: ios :: skip :: dec',甚至是'std :: ios :: skip :: any'?太髒了? (: – Rubens

+1

@Rubens:查看我更新的答案,第二部分。 – deepmax

+0

不是'std :: ctype :: scan_is'做到這一點嗎? – 0x499602D2

3

您可能正在尋找C++ String Toolkit Library

檢查本作更example

或者你可以用ignore功能這樣的嘗試:

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

事情是這樣的: -

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

然後使用類似:

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

儘管它似乎是stl的唯一可用選項,但我期待着一些更整潔的東西。一個'std :: ios :: skip :: str'和'std :: ios :: skip :: dec'甚至是'std :: ios :: skip :: any'都會非常好(: – Rubens

+0

@Rubens: - 現在有幫助嗎? –

+1

+1我從來沒有意味着你的帖子沒有幫助!^^感謝功能的例子!(: – Rubens

2

您可以簡單地用一個虛擬變量

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

但沒有直接等效AFAIK。

+0

是的,這就是爲什麼我指出「 *當然,不要使用額外的變量*「我已經習慣了這是唯一的解決方案的想法,無論如何\ = – Rubens

+0

@Rubens,對不起錯過了這個 – john