【问题标题】:sscanf failing on splitting string to double valuessscanf 无法将字符串拆分为双精度值
【发布时间】:2015-07-20 15:55:33
【问题描述】:

我不知道我在这里犯了什么错误。但是 sscanf 没有填充我的双数组(第一个索引)中的值。这是代码

int main() {
    int n = 0;
    cout << "Enter the number of equations" << endl;
    cin >> n;

    string coeffData;
    string powerData;
    double m_coeff_X[5] = {0.0,0.0,0.0,0.0,0.0};
    double m_coeff_Y[5] = {0.0,0.0,0.0,0.0,0.0};
    double m_coeff_Z[5] = {0.0,0.0,0.0,0.0,0.0};
    double m_coeff_V[5] = {0.0,0.0,0.0,0.0,0.0};
    double m_coeff_W[5] = {0.0,0.0,0.0,0.0,0.0};
    double m_const[5] = {0.0,0.0,0.0,0.0,0.0};

    for (int i = 0; i < n; i++) {
        cout << "Enter the coefficients for Number " << i+1 <<
                " equation. x,y,z,v,w (separated by commas)" << endl;
        cin >> coeffData;

        if (sscanf(coeffData.c_str(), "%f,%f,%f,%f,%f", 
            &m_coeff_X[i], &m_coeff_Y[i], &m_coeff_Z[i],
            &m_coeff_V[i], &m_coeff_W[i]) == 1) {
            cout << "value was ok";
        } else {
            cout << "value was not ok";
        }
        cout << m_coeff_X[i] << endl;
        cout << m_coeff_Y[i] << endl;
        cout << m_coeff_Z[i] << endl;
        cout << m_coeff_V[i] << endl;
        cout << m_coeff_W[i] << endl;
    }
    return 0;
}

我暂时只运行一次循环。这意味着 i=0 仅此而已..

输出是:

Enter the coefficients for Number 1 equation. x,y,z,v,w (separated by commas)
1.0,2.0,3.0,4.0,5.0
value was not ok
5.26354e-315
5.30499e-315
5.32571e-315
5.34643e-315
5.3568e-315  

编辑:感谢您提醒我它是 %lf 但不是 %f。我这样做了,但正在玩代码。解决此问题后,我得到以下输出:

Enter the coefficients for Number 1 equation. x,y,z,v,w (separated by commas)
1.0,2.0,3.0,4.0,5.0
value was not ok
1
2
3
4
5

我首先是这样做的,问题是,当我打印这些双精度时,它们打印为整数,我很困惑为什么会这样,我在这里做错了什么?

【问题讨论】:

  • sscanf 应该返回“5”(找到的#/项目),而不是“1”。也使用 "%lf" 表示 "double" (和 "%f" 表示浮点数)。

标签: c++ c scanf


【解决方案1】:

对于 double 你需要使用 %lf 而不是 %f

【讨论】:

  • 在启用警告的情况下编译,例如gcc -Wall -W 会优雅地捕捉到这个语法错误。
  • 您不应以这种方式编辑问题。它使答案不一致。
  • @k2ibegin:我编辑了您的问题以使其与答案保持一致。还要注意适当的缩进和换行如何提高可读性。
【解决方案2】:

您在sscanf 中为doubles 使用了错误的格式,它应该是%lf 而不是%f。在启用警告的情况下进行编译,例如使用 g++ -Wall -W 会优雅地捕获此语法错误。 sscanf()按照指示解析浮点数,并将它们作为floats存储到程序实际使用的内存中作为doubles。这会调用未定义的行为。

您的程序可能会崩溃。这里似乎在这些double 变量中存储了无意义的值。更准确地说,它只修改了double 变量的一半字节。 floatsdoubles 在内存中通常有不同的表示。

此外,此sscanf() 调用的返回值应与5 进行比较,而不是1sscanf 返回成功转换的字段数。这就是你的程序输出value was not ok的原因。

关于输出,数字像整数一样输出,因为它们具有整数值。您可以使用snprintf() 控制将数字转换为字符串的方式。这样做是一致的,因为您也使用sscanf()。存在一些更精细和恕我直言不正确的 API 来控制 iostreams 和 &lt;&lt; 运算符的转换。我强烈反对这些,因为它们对cout 有副作用,不容易恢复。

【讨论】:

  • 您现在可以检查已编辑的问题吗?感谢您指出了这一点 !当我再次打印它们时,我没有得到双重值。我得到整数..为什么会这样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2020-12-14
相关资源
最近更新 更多