簡體   English   中英

Stringstream 奇怪的行為

[英]Stringstream weird behaviour

我不知道這是否真的很奇怪,或者這就是它應該的樣子,但這是我目前的掙扎。 假設我們有類似的東西:

stringstream sso("12 1442 nana 7676");
double num = 0;
while(sso >> num || !sso.eof()) {
    if(sso.fail()) {
        sso.clear();
        string dummy;
        sso >> dummy;
        continue;
    }
    cout << num << endl;
}

這導致:

12
1442
7676

正如預期的那樣。 但是,例如,如果我將字符串文字更改為12 + 1442 nana 7676 ,那么我得到:

12
7676

為什么字符'+'事情搞砸了?

正如我們現在知道, +是一個有效的標記double ,所以你需要一種方法來跳到下一個空格分隔的令牌剛剛擺脫它來代替。 這個功能可以為你做到:

template<class Ct>
std::basic_istream<Ct>& next_token(std::basic_istream<Ct>& is) {
  is.clear();
  std::ctype<Ct> const& ctype = std::use_facet<std::ctype<Ct>>(is.getloc());
  if (ctype.is(ctype.space, is.peek())) {
    return is >> std::ws;
  }
  Ct c;
  while (is.get(c) && !ctype.is(ctype.space, c)) {
    ;
  }
  return is;
}

然后您可以將代碼更改為:

stringstream sso("12 + 1442 nana 7676");
double num = 0;
while (sso) {
  if (!(sso >> num)) {
    sso >> next_token;
  } else {
    cout << num << endl;
  }
}

輸出:

12
1442
7676

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM