scanf — Коэффициенты синтаксического анализа переполнения стека бинома

Я пытаюсь прочитать список биномов, разделенных строкой в ​​файле, заданном в качестве аргумента командной строки. Файл выглядит так …

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-коэффициентов. Могу ли я что-то сделать с 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;
}

0

Решение

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

это sscanf состояние строки формата: вход содержит double значение, за которым следует пробел, а затем еще один double значение.

Вы предоставляете следующее input:

 2.1x+1

Вы видите здесь double значение, за которым следует пробел, а другой double значение? Конечно, нет. Первый double значение сопровождается символом «х». Это не пробел.

Поскольку фактический ввод не соответствует ожидаемому вводу, sscanf() не в состоянии проанализировать ввод и инициализировать возвращенные значения. Если вы проверите возвращаемое значение из sscanf(), вы бы знали это.

Один из способов исправить это, это сказать sscanf() что символ следует за двойным значением.

char char_value;

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]