извлечение показателя из полинома c ++ с использованием строки c

Я пытаюсь извлечь значение коэффициентов и экспоненты из полинома. Мне уже удалось извлечь коэффициенты с помощью strtok, Я применил ту же концепцию, чтобы найти показатель, но я не знаю, как использовать strtok извлечь строку ПОСЛЕ разделителей или пропустить первый символ, и strtok это единственный извлекающий инструмент, который я знаю.

Это основная функция

#include <iostream>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;

void extractCoeff (char *str, char *copy);
void extractExp (char *str, char *copy);
int main()
{
const int SIZE = 150; // size for string input

char *string;
string = new char[SIZE];
cout << "Enter the polynomial\n"<<"minus sign must not have a blank with a coeff";
cin.ignore();
cin.getline(string, SIZE); // input string example: -4x^0 + x^1 + 4x^3 -3x^4

char *copy1;
copy1 = new char[SIZE];
strcpy(copy1, string);
extractCoeff(string, copy1);

cout << endl << endl;
char *copy2;
copy2 = new char[SIZE];
strcpy(copy2, string);
extractExp(string, copy2);return 0;
}

Это функция для извлечения коэф (работало)

void extractCoeff (char *str, char *copy)
{
char *p = strtok(str, " +"); // extract the first time
char *search;
int counter = 0;
while (p)
{
search = strstr(p, "x^");
cout << "Token: " << p << endl;
cout << "Search " << search << endl;
p = strtok(NULL, " +");
counter++;
}

cout << copy << endl;

// find coeff
int *coefficient;
coefficient = new int[counter];

p = strtok(copy, " +"); // extract the second time to find coeff
int a = 0;
while (p)
{
cout << "p: " << p << endl;
long coeff;
if (*p == 'x')
{
coeff = 1;
}
else if (*p == NULL)
{
coeff = 0;
}
else
{
char *endptr;
coeff = strtol(p, &endptr, 10);
}
coefficient[a] = coeff;
p = strtok(NULL, " +");
a++;
}

for (int i = 0; i < counter; i++)
cout << coefficient[i] << endl;
}

Это функция для извлечения показателей (не работает)

void extractCoeff (char *str, char *copy)
{
char *p = strtok(str, " +"); // extract the first time
char *search;
int counter = 0;
while (p)
{
search = strstr(p, "x^");
cout << "Token: " << p << endl;
cout << "Search " << search << endl;
p = strtok(NULL, " +");
counter++;
}

cout << copy << endl;

// find coeff
int *coefficient;
coefficient = new int[counter];

p = strtok(copy, " +"); // extract the second time to find coeff
int a = 0;
while (p)
{
cout << "p: " << p << endl;
long coeff;
if (*p == 'x')
{
coeff = 1;
}
else if (*p == NULL)
{
coeff = 0;
}
else
{
char *endptr;
coeff = strtol(p, &endptr, 10);
}
coefficient[a] = coeff;
p = strtok(NULL, " +");
a++;
}

for (int i = 0; i < counter; i++)
cout << coefficient[i] << endl;
}

void extractExp (char *str, char *copy)
{
char *p = strtok(str, " x^"); // extract the first time
//char *search;
int counter = 0;
while (p)
{
//search = strstr(p, "x^");
//cout << "Token: " << p << endl;
//cout << "Search " << search << endl;
p = strtok(NULL, " x^");
counter++;
}

cout << copy << endl;

// find coeff
int *exp;
exp = new int[counter];

p = strtok(copy, " x^"); // extract the third time
int b = 0;
while (p)
{
cout << "p2: " << p << endl;
int expVal;
if (*p == NULL)
{
expVal = 0;
}
else
{
char *endptr;
expVal = strtol(p, &endptr, 10);
}
exp[b] = expVal;
p = strtok(NULL, " x^");
b++;
}

for (int i = 0; i < counter; i++)
cout << exp[i] << endl;
}

0

Решение

Ваша проблема в том, что strtok разрушительно Вы, кажется, частично это знаете, поскольку вы делаете копию, чтобы иметь возможность использовать ее дважды в функциях. Но после extractCoeff возвращает к основному, содержимое C-строки, на которое указывает string поврежден, поэтому при звонке extractExp Вы передаете две копии плохо усеченной строки.

В C ++ вы должны использовать std::string для обработки строк. С std::string Вы можете использовать функции-члены find, find_first_of а также find_first_not_of найти подстроки, которые вы ищете и использовать substr чтобы извлечь их без уничтожить оригинальную строку.

Вы можете делать аналогичные вещи на C-строках, используя C-функции, но это был бы C-вопрос. (С помощью cout и заголовки C ++ делают вашу программу недопустимой в качестве программы на C, но все остальное — чистый C, а не идиоматический C ++.)

И кстати: strtok это не то, что вы должны изучить как способ разбора строк. Это разрушительно, его нельзя использовать повторно, а на некоторых платформах оно не поточно-ориентированное. Если у вас нет очень веских причин для необходимости деструктивного анализа на месте по сравнению с альтернативами, не используйте его или его немного лучший родственник (в POSIX) strtok_r,

1

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

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