Взять пользовательский ввод как оператор в выражение - PullRequest
0 голосов
/ 24 марта 2011

Можно ли принять ввод пользователя в качестве переменной для использования в выражении?

scanf("%s", op); //User enters "==" or "!="

if(x op y)
   //Go.

Ответы [ 2 ]

6 голосов
/ 24 марта 2011

Нет. Лучшее, что вы можете сделать, это что-то вроде:

scanf("%s", &op);
if (strcmp(op, "==") == 0) {
    result = x == y;
}
else if (strcmp(op, "!=") == 0) {
    result = x != y;
}

// now use result
0 голосов
/ 24 марта 2011

То, что вы, по сути, просите, - это способность делать eval. Некоторые динамические языки (python и т. Д.) Поддерживают его, но не поддерживают C. Даже если поддерживается eval, вам все равно необходимо выполнить проверку ввода по соображениям безопасности.

Следующий код C делает это с абстракцией и таблицей отправки:

#include <stdio.h>
typedef int (*func)(int op1, int op2);
struct op {
  char *opstr;
  func op_func;
};

int add_func(int op1, int op2)
{
  return op1 + op2;
}

int sub_func(int op1, int op2)
{
  return op1 - op2;
}

struct op ops[] = { {"+", add_func}, {"-", sub_func} };

int main (int argc, char const* argv[])
{
  int x = 10, y = 5, i = 0;
  char op[10];
  scanf("%s", &op);
  for(i = 0; i < sizeof(ops)/sizeof(ops[0]); i++){
    if(strcmp(ops[i].opstr, op) == 0){
      printf("%d\n", ops[i].op_func(x, y));
      break;
    }
  }
}
...