gpt4 book ai didi

c - 在 C 中,我应该如何使用 strtok 从多项式输入中提取系数和指数?

转载 作者:行者123 更新时间:2023-12-03 08:00:38 25 4
gpt4 key购买 nike

假设用户输入“-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]

这是我到目前为止所拥有的,但我不知道如何使用 token 。

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++;
}

最佳答案

由于用户输入中的空格以及丢失指数和系数的可能性,以及由于 1 和省略而丢失的系数,这是一个比我最初假设的问题更棘手的问题。

这是可以完成的,但它需要在标记化之前进行装饰,其中您装饰要使用指数和系数之间的新分隔符来标记化的字符串,以确保您可以使用strtok()。否则,因为必须保留 +/- 并且输入格式可以是,例如"4x^1 + 3x^2" 除了 '+' 周围的空格外,13 之间没有分隔符 必须被视为 3 的一部分。

格式化输入中的临时字符串的一个简单方法是删除所有空格并在指数和系数之间添加一个新的'x'。这允许您使用与 strtok() 相同的分隔符字符串,例如“x^\n”无需调整。

可以通过从当前索引循环到指数,为系数分配 0 并为指数分配循环计数器来处理丢失的系数和指数。然后您可以添加当前系数和指数。

将其放在一起并使用 sscanf()最低程度验证从字符串到 int 的每次转换,您可以执行类似于以下操作的操作:

#include <stdio.h>
#include <string.h>

#define MAXC 1024 /* if you need a constant, #define one (or more) */
#define MAXCOEF 256
#define MAXEXP MAXCOEF
#define DELIM "x^\n"

int main (void) {

char buf[MAXC], tmp[MAXC]; /* input & reformat buffers */
int coef[MAXCOEF] = {0}, /* coefficient array */
expo[MAXEXP] = {0}, /* exponent array */
n = 0, ndx = 0; /* counter and index */

fputs ("enter polynomial: ", stdout); /* prompt */

if (!fgets (buf, MAXC, stdin)) { /* read line in buf/validate */
puts ("(user canceled input)");
return 0;
}

for (int i = 0; buf[i]; i++) { /* loop remormat buf in tmp */
if (buf[i] != ' ') { /* if not space */
if (buf[i] == '-' || buf[i] == '+') { /* if before next coef */
tmp[n++] = 'x'; /* decorate with new 'x' */
}
tmp[n++] = buf[i]; /* add from buf to tmp */
}
else { /* otherwise was ' ' */
if (buf[i+1] == 'x') { /* if next char is 'x' */
tmp[n++] = '1'; /* coef not given - use 1 */
}
}
}
tmp[n] = 0; /* nul-terminate tmp */

/* separate each token with strtok */
for (char *tok = strtok (tmp, DELIM); tok; tok = strtok (NULL, DELIM)) {
int ctmp, etmp; /* temp values for coefficient and exponent */

if (sscanf (tok, "%d", &ctmp) != 1) { /* convert coefficient to int */
fprintf (stderr, "conversion failed for '%s'.\n", tok);
return 1;
}

if (!(tok = strtok (NULL, DELIM))) { /* get exponent token */
break;
}
if (sscanf (tok, "%d", &etmp) != 1) { /* convert exponent to int */
fprintf (stderr, "conversion failed for '%s'.\n", tok);
return 1;
}

for (int i = ndx; i < etmp; i++) { /* loop index to exponent */
coef[ndx] = 0; /* add any missing values */
expo[ndx++] = i; /* increment index */
}

coef[ndx] = ctmp; /* add coefficient & exponent */
expo[ndx++] = etmp; /* increment index */
}

fputs ("\ncoef:", stdout); /* output coefficients */
for (int i = 0; i < ndx; i++) {
printf (" % d", coef[i]);
}
putchar ('\n'); /* tidy up with newline */

fputs ("expo:", stdout); /* output exponents */
for (int i = 0; i < ndx; i++) {
printf (" % d", expo[i]);
}
putchar ('\n');
}

示例使用/输出

$ ./bin/strtokpoly
enter polynomial: -4x^0 + x^1 + 4x^3 - 4x^5 - 3x^7

coef: -4 1 0 4 0 -4 0 -3
expo: 0 1 2 3 4 5 6 7

这对应于您所需的输出。

仔细检查一下,如果有疑问请告诉我。

关于c - 在 C 中,我应该如何使用 strtok 从多项式输入中提取系数和指数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74333505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com