2011-08-21 103 views
0

我爲C++新手道歉。我試圖通過翻譯Java的一些代碼來學習。C++奇怪的istringstream行爲

在此代碼中,讀入的字符串表示一種語言中以%表示的字母頻率。

我們正在處理的測試字符串是a10b10c10d10e10f50,如測試代碼所示。

在下面的循環中,第5個和第6個(0.1和0.5)正確讀入前3個值(0.1,0,1,0.1),但由於某些原因,字母'd ',當i爲9時,按照Visual Studio中的調試器讀入爲1000000000.0000000。任何想法爲什麼?

#include <iostream> 
#include <vector> 
#include <sstream> 
#include <string> 
#include <cmath> 

using namespace std; 

class SymbolFrequency { 
public: 
    double language(vector <string> frequencies, vector <string> text) { 

     for (unsigned int fset = 0; fset < frequencies.size(); fset++) { 
      double expected[26]; 
      fill(expected, expected + 26, 0.0); 
      for(unsigned int i = 0; i < frequencies[fset].length(); i += 3) { 
       char letter = frequencies[fset][i]; 
       istringstream is(frequencies[fset].substr(i + 1, i + 3)); 
       double freq; 
       is >> freq; freq /= 100; 
       expected[letter - 'a'] = freq; 
      } 
... 

測試代碼:

int main() { 
    SymbolFrequency s; 
    const char *fargs[] = {"a10b10c10d10e10f50"}; 
    vector<string> f(fargs, fargs + 1); 
    vector<string> t; 
    t.push_back("abcde g"); 
    double d = s.language(f,t); 
    cout << (d) << endl; 
    cin.get(); 
    return 0; 
} 
+0

你想實現與'矢量 F(fargs,fargs + 1)什麼;'?如果你只想存儲一個字符串(看起來像我),你不需要一個向量。 – Nobody

+0

@無人 - 該方法可以採取一系列字符串。如果我有10個字符串,我不需要10行'push_back'語句。對於這個測試,它碰巧只有1個。但我不認爲這與我的問題有關。 –

回答

2

你不是叫SUBSTR()正確;請嘗試frequencies[fset].substr(i + 1, 2)

(的原因奇怪的價值在於,它解析10e10爲100十億。)

+0

非常感謝。看起來'substr'方法與Java等效的'substring'不同。 –