C++怪异的分布流行为

C++ Weird istringstream behaviour

本文关键字:流行 分布 C++      更新时间:2023-10-16

我为自己是C++新手而道歉。我正试图通过翻译Java中的一些代码来学习。

在该代码中,读入的字符串表示一种语言中的字母频率(%(。

正如测试代码所示,我们正在处理的测试字符串是a10b10c10d10e10f50

在下面的循环中,前3个值(0.1、0、1、0.1(以及第5个和第6个(0.1和0.5(被正确读入,但根据Visual Studio中的调试器,由于某种原因,当i为9时,字母"d"的第4个值被读入为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;
}

您没有正确调用substr((;尝试frequencies[fset].substr(i + 1, 2)

(这个奇怪值的原因是它将10e10解析为1000亿。(