C токенизировать полиномиальные коэффициенты - PullRequest
1 голос
/ 26 ноября 2009

Я пытаюсь поместить коэффициенты полиномов из массива char в массив int
У меня есть это:

char string[] = "-4x^0 + x^1 + 4x^3 - 3x^4";

и может маркировать его пробелом в
-4x ^ 0
х ^ 1
4x ^ 3
3x ^ 4

Итак, я пытаюсь получить: -4, 1, 4, 3 в массив int

 int *coefficient;
 coefficient = new int[counter];

 p = strtok(copy, "  +");
 int a;
 while (p)
 {
  int z = 0;
  while (p[z] != 'x')
   z++;
  char temp[z];
  strncpy(temp[z], p, z);
  coefficient[a] = atoi(temp);
  p = strtok(NULL, "  +");
  a++;
 }

Однако я получаю сообщение об ошибке, что не могу преобразовать символ * в символ on strncpy (temp [z], p, z);

error: invalid conversion from ‘char’ to ‘char*’  
error: initializing argument 1 of ‘char* strncpy(char*, const char*, size_t)’

Как лучше всего это сделать?

Ответы [ 4 ]

4 голосов
/ 26 ноября 2009

Это:

strncpy(temp[z], p, z);

Должно быть:

strncpy(temp, p, z);

Но помните, что strncpy не всегда завершает строку нулем.

Также, z будет длиной коэффициента, но вам потребуется дополнительный байт в буфере для нулевого терминатора.

Обновление:

проверяя вашу ссылку, я все еще вижу несколько серьезных проблем:

  • Вы не можете использовать «-» в strtok, потому что он подберет тот, что в «-4x», а также тот, который вы хотите. Я думаю, что вы должны разбивать только на пробелы и обрабатывать операторы +/- как токены.
  • Функция strncpy оставляет строку без завершения, что может привести к сбою atoi или случайному выбору неверного значения. Одна идиоматическая форма - написать терминатор вручную, например, temp[z] = '\0'.
  • Причина, по которой вы не получаете никаких выходных значений, заключается в том, что coefficient[a] = выполняет запись в некоторую случайную память, поскольку a неинициализирован.
0 голосов
/ 26 ноября 2009

Такое решение может быть сделано достаточно легко, но чтобы сделать его защищенным от лишних пробелов, пропусков пробелов и достаточно широким, чтобы обрабатывать несколько операторов и имен переменных, такая стратегия становится все более сложной и трудной (особенно если вам необходимо иметь значимые сообщения об ошибках, если синтаксический анализ не удался).

Мне кажется, было бы проще реализовать пуленепробиваемое решение с использованием boost.regex (или даже boost.spirit, если общая задача требует анализа порядка операций), которое может легко обрабатывать синтаксисы такого рода с большим Степень толерантности.

0 голосов
/ 26 ноября 2009

Другие парни правы в том, что strncpy () использует temp вместо temp [z].

Я собираюсь предположить, что вы также хотите захватить показатели в вашей свободной переменной. Я наблюдаю неявный термин «0x ^ 2», которым вы, кажется, пренебрегаете. Если следующим шагом будет оценка вашего полинома для различных значений x (или, что еще хуже, использование решателя для него), вам необходимо знать эти полномочия.

0 голосов
/ 26 ноября 2009

Вы передаете char на strncpy:

  strncpy(temp[z], p, z);

Первый аргумент должен быть указателем char*, а не единственным char. Что вы, вероятно, хотите сделать, это:

  strncpy(temp, p, z);
...