Если пользователь вводит «сумма(x,y)», как я могу получить x и y в виде двойников

#c #linux #string #input #terminal

Вопрос:

Я пишу простую программу-калькулятор, такую, чтобы пользователь входил в собственную консольную среду программ. Каждая новая строка начинается с $. Пользователь введет такие команды,как «сумма(x,y)», «mul(x, y)» и т. Д., И программа примет x и y как двойные и выполнит функцию, т. е. «удвоит mul(x, y){возвращает x*y)» и отобразит возвращенное значение.

Я заставил его правильно идентифицировать команду на основе сопоставления первых трех символов в строке.

Кажется, я не могу правильно прочитать числовые значения, что бы я ни делал. Любые предложения будут высоко оценены!

Приведенный ниже код взят из main()

     printf("%s", " $    ");
    fgets(input, sizeof(input), stdin);
    sscanf(input,"(%d,%d)",amp;arg1,amp;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 %dn", arg1,arg2);
        double output = sum(arg1,arg2);
        printf("DEBUG: Output should be: %dn", output);
        printf("%dn",output);

    }else if ...
 

Раздел с комментариями-это остатки другого способа, который я пробовал. Если кто-нибудь может сказать мне, как правильно это сделать, я был бы очень благодарен.

Комментарии:

1. arg1 и arg2 должны были быть объявлены double , и %lf должны были использоваться sscanf вместо %d этого . Возвращаемое значение sscanf также должно было быть проверено.

2. Если вам нужны double значения, то зачем sscanf(input,"(%d,%d)",amp;arg1,amp;arg2); разбирать arg1 и arg2 как int ? Почему нет char op[32]; ... if (sscanf(input,"1[^(](%lf,%lf)", op, amp;arg1, amp;arg2) == 3) { /* valid op and args */ } ?

Ответ №1:

Хорошая работа при чтении, fgets() а затем при анализе значений sscanf() . Если я понимаю вопрос, и у вас может быть несколько операторов, за которыми следуют два двойника в круглых скобках , например SUM(1.1, 2.2) , и вы хотите разделить и сохранить оператор и двойные значения, тогда вы можете использовать строку формата, такую как:

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

Это будет читаться от input разделения всего до пробела или '(' в op , а затем считывания двойных значений в x и y . Считывая op до пробела или '(' , вы разрешаете ввод sum(1.1, 2.2) или sum (1.1, 2.2) плавно.

Например, вы могли бы сделать:

 #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, "1[^( ] (%lf,%lf)", op, amp;x, amp;y) == 3)
            printf (" op: '%s'  x: %.2f  y: %.2fn", op, x, y);
        else
            fputs ("  error: invalid input.n", stderr);
    }
}
 

Пример Использования/Вывода

 ./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):
 

Дайте мне знать, если у вас возникнут дополнительные вопросы, или если я неправильно понял вопрос.

Комментарии:

1. Это именно то, что я пытался сделать, большое вам спасибо

2. Мы вам очень рады. Удачи вам с кодированием!