#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. Мы вам очень рады. Удачи вам с кодированием!