我们不能在单个程序中的不同字符串上使用strtok吗?

时间:2013-06-18 07:39:19

标签: c string

我正在尝试编写一个计算器程序,所以我需要评估一个表达式。

所以我需要根据给定的运算符执行操作。我把整个表达式都变成了一个字符串。

例如,它可能是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 string吗?

5 个答案:

答案 0 :(得分:2)

第一个strtok不会返回NULL代表“3 + 5”,而是指向代币“3 + 5”的指针 (所以else语句不会被执行)。

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

答案 1 :(得分:1)

第一个strtok调用不会返回NULL(除非您的输入字符串为空或仅包含'*'个字符),因此else语句将不会被执行对于像"5+6"这样的字符串。

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

答案 2 :(得分:1)

输入“3 + 5”的情况strtok(input1,“*”)的结果是“3 + 5”,那个else子句不执行,因为它不应该是NULL。

答案 3 :(得分:0)

strtok的第二个参数是像strtok (input1, "+*")这样的数组使用。这意味着,如果他们获得'*''+',则会进行标记。

答案 4 :(得分:-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;
}