1

我正在尝试编写一个计算器程序,因此其中一部分我需要评估一个表达式。

所以我需要根据给定的运算符执行操作。我将整个表达式放入一个字符串中。

例如,它可能是 5+6 或 5*6。

所以我是这样写的:

    char input1[20] = "";
    char input2[20] = "";
    char output[20] = "";
    char *arg1= NULL, *arg2 = NULL;
    int value;

    getinput ( input1); //Function for getting the expression
    strcpy (input2, input1);

    if ( arg1 = strtok (input1, "*"))
    {
        arg2 = strtok (NULL, "");
        value = atoi(arg1) * atoi(arg2);
    }
    else
    {
        char* arg1, *arg2;

        arg1 = strtok ( input2, "+");
        arg2 = strtok ( NULL, "");

        value = atoi (arg1) + atoi(arg2);
    }
    sprintf (output,"%d", value);
    printf ("The output value is %s", output);

此代码仅在我给出具有乘法的表达式时才有效。例如,它只有在我给出 5*6 时才有效。如果我给出 5+6,这将不起作用。

问题出在其他部分。它无法对字符串 input2 进行标记。

我不能在一个程序中标记两个不同的字符串。

我哪里错了?有人可以解释一下为什么 strtok 不适用于 secong 字符串的概念吗?

4

5 回答 5

2

第一个strtok不会返回NULL“3+5”,而是指向标记“3+5”的指针(因此不会执行 else 语句)。

现在的问题是第二次调用strtok(代码中的第 12 行附近)将返回NULL,随后的调用atoi(NULL)将出现段错误。

于 2013-06-18T08:01:57.443 回答
1

strtok(input1, "*") 的输入“3+5”结果为“3+5”,否则不会执行 else 子句,因为它不应该为 NULL。

于 2013-06-18T07:56:53.610 回答
1

第一次strtok调用将不会返回NULL(除非您的输入字符串为空或仅包含'*'字符),因此else不会对像"5+6".

您可能希望使用strchr(或类似的)来确定要执行的操作,然后获取操作数。

于 2013-06-18T07:56:09.193 回答
0

strtok 的第二个参数是这样的数组使用strtok (input1, "+*")'*'这意味着如果他们得到或 ,它将标记化'+'

于 2013-06-18T08:01:38.707 回答
-1

我编码如下:

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


int main()
{
    char ss[100] = "123+321";

    int a = atoi(ss);
    int aLength = (int)floor(log10((double)a))+1;
    int b = atoi(ss+aLength);
    if(ss[aLength] == '+')
        printf("%d + %d = %d\n", a, b, (a+b));
    else
        printf("%d * %d = %d\n", a, b, (a*b));
    return 0;
}
于 2013-06-18T08:21:43.753 回答