2017-04-12 79 views
2

任何人都可以告訴我爲什麼我的函數不會打印第一個字母后的第一個字母?這是我的代碼。C++函數將不會打印行的第一個字母

void plusScores(ifstream& in, ostream& out) 
{ 
    string name; 
    char score; 
    int plus = 0; 
    int minus = 0;; 
    double sum; 
    double percent; 

    while (getline(in, name)) 
    { 

     while (in >> score && (score == '+' || score == '-')) 
     { 
      if (score == '+') 
       plus++; 
      else if (score == '-') 
      minus++; 
     } 

     sum = plus + minus; 
     percent = (plus/sum) * 100; 

     out << fixed << showpoint << setprecision(1); 

     out << name << ": " << percent << "% plus" << endl; 

     plus = 0; 
     minus = 0; 
    } 
} 

我的輸出應該是這樣的:

Kane, Erica: 40.0% plus 
Chandler, Adam: 75.0% plus 
Martin, Jake: 100.0% plus 
Dillon, Amanda: 62.5% plus 

相反,我得到這樣的:

Kane, Erica: 40.0% plus 
handler, Adam: 75.0% plus 
artin, Jake: 100.0% plus 
illon, Amanda: 62.5% plus 

的文本文件,它的閱讀這個樣子的:

Kane, Erica 
--+-+ 
Chandler, Adam 
++-+ 
Martin, Jake 
+++++++ 
Dillon, Amanda 
++-++-+- 

回答

3

因爲while (in >> score && (score == '+' || score == '-'))讀這些字母。因爲它們不是+-那麼它們就不會被使用。

相反,我建議使用getline+/-線爲好,再算上+-完整的字符串中的數字。 (請參閱this question瞭解如何計算它們。)

+0

['的std :: count'](http://en.cppreference.com/w/cpp/algorithm/count)結合推薦使用std的' ::'getline'代表'+ -'值的行可能會非常方便。 – WhozCraig

4

當您到達「 - + - +」行的末尾時,代碼已經讀入名稱的第一個字符。它不再有getline閱讀。這是因爲in >> score跳過了空格字符。您可以使用in >> std::noskipws >> score。但是,如果在+ - 和換行符之間存在空格,那麼這可能會導致在真實世界應用程序中出現一些有趣的其他問題,您將讀取「name」的空行,然後使用名稱來計算零分數(除非在名稱的開頭有+或 - )。

另一種選擇是一致地使用getline,而不是從輸入文件中一次讀取一個字符,讀取一行並在得到的字符串中計數+和 - 。

第三個選擇是從輸入中「取消」最後一個字符。循環後,插入in.unget(score);以使用此方法。

所有這些方法的優點和缺點都略有不同。一般來說,混合getline>>不是一個好主意。

1

修復代碼:

void plusScores(ifstream& in, ostream& out) 
{ 
string name; 
string scores; 

int plus = 0; 
int minus = 0;; 
double sum; 
double percent; 

while (getline(in, name)) 
{ 

    getline(in, scores); 
    int loc = 0; 
    while (loc < scores.length()) 
    { 
     if (scores.at(loc) == '+') 
      plus++; 
     else if (scores.at(loc) == '-') 
      minus++; 
     loc++; 
    } 

    sum = plus + minus; 
    percent = (plus/sum) * 100; 

    out << fixed << showpoint << setprecision(1); 

    out << name << ": " << percent << "% plus" << endl; 

    plus = 0; 
    minus = 0; 
} 
} 
相關問題