# If user inputs "sum(x,y)" how can I get x and y as doubles

I am writing a simple calculator program such that the user is entered into the programs own console environment. Each new line starts with a \$. User will enter commands such as '''sum(x,y)''' '''mul(x,y)''' etc. and the program will take x and y as doubles and execute a function i.e. '''double mul(x, y){return x*y)''' and display the returned value.

I have gotten it to correctly identify the command based on matching the first three characters in the string.

I cant seem to read the numerical values correctly no matter what I do. Any suggestions are greatly appreciated!

The Code below is from main()

``````    printf("%s", " \$    ");
fgets(input, sizeof(input), stdin);
sscanf(input,"(%d,%d)",&arg1,&arg2);

if(strstr(input,"sum")){
//char *starting_pos = strchr(input,dlm);
//int position = (starting_pos == NULL ? -1 : (uintptr_t)starting_pos);

//arg1 = input[position + 1];
//arg2 = input[position + 3];
printf("DEBUG: arg1 is %d arg2 is %d\n", arg1,arg2);
double output = sum(arg1,arg2);
printf("DEBUG: Output should be: %d\n", output);
printf("%d\n",output);

}else if ...
``````

The commented section is the remnants of another way I was trying. If anyone can tell me what the right way to do this is I would be very grateful.

## 1 answer

• answered 2021-03-03 02:45

Good job in reading with `fgets()` and then parsing values with `sscanf()`. If I understand the question, and you may have multiple operators followed by two doubles in parenthesis, e.g. `SUM(1.1, 2.2)`, and you want to separate and save the operator, and the double values, then you can use a format string such as:

``````#define MAXOP   32
...
char op[MAXOP];
...
sscanf (input, "%31[^( ] (%lf,%lf)", op, &x, &y)
``````

This will read from `input` separating everything up to a whitespace or `'('` into `op` and then reading the double values into `x` and `y`. By reading the `op` to a whitespace or `'('`, you allow input of `sum(1.1, 2.2)` or `sum (1.1, 2.2)` seamlessly.

For example, you could do:

``````#include <stdio.h>

#define MAXC  1024
#define MAXOP   32

int main (void) {

while (1) {
char input[MAXC], op[MAXOP];
double x, y;

fputs ("\nenter OP(x, y): ", stdout);
fflush (stdout);

if (!fgets (input, MAXC, stdin)) {
puts ("(user canceled input)");
return 0;
}
if (*input == '\n')
break;

if (sscanf (input, "%31[^( ] (%lf,%lf)", op, &x, &y) == 3)
printf (" op: '%s'  x: %.2f  y: %.2f\n", op, x, y);
else
fputs ("  error: invalid input.\n", stderr);
}
}
``````

Example Use/Output

``````./bin/sumxy

enter OP(x, y): mult(10.1,12.4)
op: 'mult'  x: 10.10  y: 12.40

enter OP(x, y): mult (8.3, 12.1)
op: 'mult'  x: 8.30  y: 12.10

enter OP(x, y): sum(1.1, pickles)
error: invalid input.

enter OP(x, y): sum(1.1, 2.2)
op: 'sum'  x: 1.10  y: 2.20

enter OP(x, y):
``````

Let me know if you have further question, or if I misunderstood the question.