我为成为一名C ++新手而道歉。我试图通过翻译Java中的一些代码来学习。
在此代码中,读入的字符串表示字母中的字母频率,以%表示。
我们正在处理的测试字符串是a10b10c10d10e10f50
,正如测试代码所示。
在下面的循环中,正确读入前3个值(0.1,0,1,0.1),第5个和第6个(0.1和0.5),但由于某种原因,字母'd'的第4个值根据Visual Studio中的调试器,当i
为9时,将以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 :(得分:2)
你没有正确地调用substr();试试frequencies[fset].substr(i + 1, 2)
。
(奇怪的价值在于它将10e10
解析为1000亿。)