二进制函数c++的系数解析

Parse Coefficients of Binomials c++

本文关键字:函数 c++ 二进制      更新时间:2023-10-16

我正在尝试读取二进制数列表,这些二进制数在作为命令行参数的文件中以行分隔。文件看起来像这样。。。

numbers.txt

2.1x+1
3x-5.3
-24.1x+24.7
0x-15.5
-12.3x+0

预期输出:

input: 2.1x+1
real: 2.1
imag: +1
input: 3x-5.3
real: 3
imag: -5.3
input: -24.1x+24.7
real: -24.1
imag: +24.7
input: 0x-15.5
real: 0
imag: -15.5
input: -12.3x+0
real: -12.3
imag: +0

我的输出:

input: 2.1x+1
real: 2.1
imag: 2.07545e-317
input: 3x-5.3
real: 3
imag: 2.07545e-317
input: -24.1x+24.7
real: -24.1
imag: 2.07545e-317
input: 0x-15.5
real: -24.1
imag: 2.07545e-317
input: -12.3x+0
real: -12.3
imag: 2.07545e-317

我正在努力使"实数"双变量值正确。sscanf((也没有检测到其中一个x系数的前导零值,我可以对sscann((做些什么来解决这个问题吗?

#include <iostream>
#include <istream>
#include <fstream>
#include <algorithm>
#include <sstream>
#include <vector>
using namespace std;
class binomial
{
public:
  double real;
  double imag;
  string usercmplx;
};
int main(int argc, char* argv[]){
  string word, input;
  vector <binomial> VecNums;
  binomial complexnum;
  // Inializes vector to size for speedup                                                                             
  VecNums.reserve(1000);
  ifstream file(argv[1]);
  // Parse txt file line by line                                                                                      
  while (file >> input) {
    // handle empty lines                                                                                             
    if (!input.empty()){
    // Saves the user input format                                                                                    
    complexnum.usercmplx = input;
    // This seperates the input into the real and imaginary parts                                                     
    sscanf(input.c_str(), "%lf %lf", &complexnum.real, &complexnum.imag);
    cout << "input: " << input << endl;
    cout << "real: " << complexnum.real << endl;
    cout << "imag: " <<complexnum.imag << endl;
    // Push binomials into Vector                                                                                       
    VecNums.push_back(complexnum);
    }
  }
  return 0;
}
sscanf(input.c_str(), "%lf %lf", &complexnum.real, &complexnum.imag);

sscanf格式字符串声明:输入包含一个double值,后面跟着一些空白,后面跟着另一个double值。

您提供以下input:

 2.1x+1

您在这里看到一个double值,后面跟着一些空格,还有另一个double值吗?当然不是。第一个double值后面跟有字符"x"。这不是空白。

由于实际输入与预期输入不匹配,sscanf()无法解析输入并初始化返回值。如果您检查sscanf()的返回值,您就会知道这一点。

解决此问题的方法之一是告诉sscanf()一个字符跟在双值后面。

char char_value;
sscanf(input.c_str(), "%lf%c%lf", &complexnum.real, &char_value, &complexnum.imag);