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 ie '''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.
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, eg 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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.