我正在尝试编写一个计算器程序,所以我需要评估一个表达式。
所以我需要根据给定的运算符执行操作。我把整个表达式都变成了一个字符串。
例如,它可能是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吗?
答案 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;
}