0

我正在尝试读取二项式列表,在作为命令行参数给出的文件中按行分隔。文件看起来像这样...

数字.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 系数之一的前导零值,我可以对 sscanf() 做些什么来解决这个问题?

#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;
}
4

1 回答 1

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()一个字符跟在 double 值之后。

char char_value;

sscanf(input.c_str(), "%lf%c%lf", &complexnum.real, &char_value, &complexnum.imag);
于 2016-09-06T00:09:53.073 回答