1

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

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

并可以通过空间将其标记为
-4x^0
x^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++;
 }

但是,我收到一个错误,我无法在 strncpy(temp[z], p, z); 上将 char* 转换为 char;

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

最好的方法是什么?

4

4 回答 4

4

这:

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

需要是:

strncpy(temp, p, z);

但请记住,strncpy这并不总是以空值结尾的字符串。

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

更新:

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

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

你正在传递一个charto strncpy

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

第一个参数应该是一个char*指针,而不是单个char. 你可能的意思是:

  strncpy(temp, p, z);
于 2009-11-26T02:25:21.373 回答
0

其他人对 strncpy()'ing 到 temp 而不是 temp[z] 的看法是正确的。

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

于 2009-11-26T02:45:05.060 回答
0

这种解决方案可以很容易地制作,但要使其能够防止额外的空白,缺少空白并且足够广泛以处理多个运算符和变量名,这种策略越来越复杂和困难(特别是如果你需要有有意义的错误解析失败时的消息)。

在我看来,使用 boost.regex (如果整个任务需要分析操作顺序,甚至是 boost.spirit )实现一个防弹解决方案会更容易,它可以轻松处理这些具有很大容忍度的语法.

于 2009-11-26T08:40:35.750 回答