隨着scanf
一個被允許跳過匹配令牌,簡單地增加*
到圖案,如在:忽略/跳過令牌:: CIN
int first, second;
scanf("%d %*s %d", &first, &second);
是否與std::cin
任何等效方法?喜歡的東西(當然,節約其他變量的使用):
int first, second;
std::cin >> first >> `std::skip` >> second;
隨着scanf
一個被允許跳過匹配令牌,簡單地增加*
到圖案,如在:忽略/跳過令牌:: CIN
int first, second;
scanf("%d %*s %d", &first, &second);
是否與std::cin
任何等效方法?喜歡的東西(當然,節約其他變量的使用):
int first, second;
std::cin >> first >> `std::skip` >> second;
對於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;
}
您可以擴展和改善上面的代碼來實現你所需要的。
您可能正在尋找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;
+1聽起來很合理!^^一組跳過,如'std :: ios :: skip :: str','std :: ios :: skip :: dec',甚至是'std :: ios :: skip :: any'?太髒了? (: – Rubens
@Rubens:查看我更新的答案,第二部分。 – deepmax
不是'std :: ctype :: scan_is'做到這一點嗎? – 0x499602D2