假设用户输入"-4x^0 + x^1 + 4x^3 - 4x^5 - 3x^7"
作为输入,我想从字符串中提取值,并将它们传递给coef[]
和expo[]
,如下所示:
coef = [-4, 1, 0, 4, 0, -4, 0, -3]
expo = [ 0, 1, 2, 3, 4, 5, 6, 7]
这是我到目前为止所拥有的,但我不知道如何使用令牌。
int main()
{
char userInput[100];
char temp[100];
printf("Enter the polynomial: ");
scanf("%[^\n]%*c", userInput);
strcpy(temp, userInput);
printf("\n");
int coef[100];
int expo[100];
for (int i = 0; i < 100; i++) {
coef[i] = 0;
expo[i] = 0;
}
char *tok = strtok(temp, "x^");
int counter = 0;
while (tok) {
printf("*%s*\n", tok);
tok = strtok(NULL, "x^");
counter++;
}
return 0;
}
我尝试了以下方法,但没有成功:
int counter = 0;
while (tok) {
printf("*%s*\n", tok);
expo[counter] = atoi(tok);
tok = strtok(NULL, "x^");
counter++;
}
3条答案
按热度按时间zxlwwiss1#
这是一个比我最初设想的更棘手的问题,因为用户输入中存在空格,可能会丢失指数和系数--以及由于
1
而被省略而丢失的系数。这是可以做到的,但是在标记化之前需要 * Decorate *,在这里,您要在指数和系数之间用新的分隔符 * 修饰 * 要标记化的字符串,以确保您可以使用
strtok()
。否则,由于必须保留+/-
,并且输入格式可以是,例如X1 M3 N1 X,除了必须被认为是X1 M7 N1 X的一部分的X1 M6 N1 X周围的空白之外,在X1 M4 N1 X和X1 M5 N1 X之间没有定界符。一个简单的格式化输入的临时字符串的方法是删除所有的空格,并在指数和系数之间添加一个新的
'x'
。这允许您使用与strtok()
相同的定界符字符串,例如"x^\n"
,而无需调整。对于缺失的系数和指数,可以通过从当前索引循环到指数来处理,为系数分配
0
,为指数分配循环计数器。然后,您可以添加当前系数和指数。把它放在一起,并使用
sscanf()
* 最低限度地 * 验证每个从string到int
的转换,您可以执行类似于以下的操作:使用/输出示例
它对应于您所需的输出。
把事情看一遍,如果有问题就告诉我。
nhhxz33t2#
strtok()
不是解决此问题的好方法,尤其是使用"x^"
作为分隔符列表,因为它将用空字节覆盖这些字符,因此无法区分2x
和2
。另请注意,如果使用者输入的多项式长度超过99个字节,
scanf("%[^\n]%*c", userInput)
会有未定义的行为。应该测试scanf()
的传回值,以侦测未预期的文件结尾。使用fgets()
并测试传回值会比较安全。若要解析多项式,建议一次测试一个字符,并使用
strtol
或类似函数转换数字。以下是修改后的版本:
上面的代码使用了您的方法,并用系数和指数填充了2个数组。
c9qzyr3d3#
这对于strtok来说有点太复杂了,因为你有各种各样的隐式系数之类的极端情况。你可以走完整的解析路线,使用lex & yacc,但这可能有点矫枉过正。一种混合方法是使用fgets + sscanf来匹配特定的模式。类似于:
请注意,这可能很快变得非常复杂,需要检查许多不同的极端情况,但对于简单的事情,可能比使用完整的解析器更容易。