C标记化多项式系数

时间:2009-11-26 02:20:16

标签: c++ string tokenize

我正在尝试将char数组中的多项式系数放入int数组中 我有这个:

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

并可以通过空格将其标记为
-4x ^ 0
的x ^ 1个
4X ^ 3
3×^ 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++;
 }

然而,我得到一个错误,我不能将char *转换为char 在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 个答案:

答案 0 :(得分:4)

此:

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

需要:

strncpy(temp, p, z);

但请记住,strncpy并不总是空终止字符串。

此外,z将是系数的长度,但是在缓冲区中需要一个额外的字节用于空终止符。

更新

检查你的链接,我仍然看到几个严重的问题:

  • 你不能在strtok中使用“ - ”,因为它会选择“-4x”中的那个以及你想要的那个。我认为你应该只分割空格并将+/-运算符作为标记处理。
  • strncpy函数使字符串未终止,这可能导致atoi崩溃或随机提供错误的值。一种惯用形式是手动编写终结符,例如temp[z] = '\0'
  • 您没有获得任何输出值的原因是coefficient[a] =正在写入某个随机内存,因为a未初始化。

答案 1 :(得分:0)

您将char传递给strncpy

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

第一个参数应该是char*指针,而不是单个char。你可能想做的是:

  strncpy(temp, p, z);

答案 2 :(得分:0)

其他人对于strncpy()进入临时而不是临时[z]是正确的。

我建议您也想要捕获自由变量上的指数。我观察到一个隐含的“0x ^ 2”术语,你似乎忽略了它。如果您的下一步是评估多项式的​​各种x值(或者更糟糕的是,在其上运行求解器),您将需要知道这些幂。

答案 3 :(得分:0)

这种解决方案可以很容易地制作,但是为了防止额外的空白区域,缺少空白区域以及足以处理多个操作员和变量名称的这种策略越来越复杂和困难(特别是如果你需要如果解析失败,则会有有意义的错误消息。)

在我看来,使用boost.regex实现防弹解决方案会更容易(如果整个任务需要分析操作顺序,甚至还可以使用boost.spirit),这样可以轻松处理这些类型的语法宽容度。