2015-03-08 5 views
0

В программе, над которой я работаю, я хочу разрешить пользователю вводить символические имена, которые программа будет конвертировать в предопределенные числа.Как преобразовать строки в числа

Например, если пользователь AA то программа будет использовать значение 10, но если пользователь BB то программа будет использовать значение 20.

Как преобразовать строки в числа?

+6

Пожалуйста, ваш вопрос ясно, что это совершенно неясно. –

+0

с большим количеством ручного кодирования, сравнивая входные данные с строками, один за другим – sp2danny

+0

Похоже, вы очень смущены тем, что происходит на вашем компьютере для скомпилированной программы на C. –

ответ

0

scanf является с Funtion вы должны использовать

4

Вы должны будете использовать таблицу поиска. Используйте scanf, чтобы прочитать строку, а затем вызвать функцию поиска, чтобы преобразовать строку в значение.

int value = -1; 
char string[32]; 
if (scanf("%31s", string) == 1) 
    value = valueForString(string); 

Вот простая таблица

typedef struct 
{ 
    const char *string; 
    int value; 
} 
    stLookup; 

static stLookup lookup[] = 
{ 
    { "AA", 10 }, 
    { "BB", 20 }, 
    { NULL, -1 } 
}; 

поиск И вот valueForString функцию

int valueForString(const char *string) 
{ 
    stLookup *lptr; 

    for (lptr = lookup; lptr->string != NULL; lptr++) 
     if (strcmp(lptr->string, string) == 0) 
      break; 

    return(lptr->value); 
} 
+1

Малый: Почему 32/30, а не 'string [32]; if (scanf («% 31s», ... '? – chux

+0

@chux Вы правы. Я стараюсь сделать буферы намного большими, чем необходимо, и не использовать весь буфер, потому что я предпочитаю тратить несколько (временных) байтов (в стеке) вместо того, чтобы рисковать ошибкой по очереди. Я изменил ответ, чтобы избежать путаницы :) – user3386109

2

вы можете создать массив, содержащий имена и массив, содержащий соответствующие значения, как

char *a[10] = {"AA", "BB", ...}; 
int b[10] = {10, 20, ...}; 

тогда вы делаете зсап к полукоксу * указатель, например, с именем входа, то вы можете итерируете массив, чтобы найти индекс, а затем восстановить соответствующий индекс в массиве B:

for (i = 0; i < 10; i++) 
{ 
    if (!strcmp(input, a[i])) 
     break; 
} 

if (i != 10) 
    value = b[i]; 

, то вы получите значение введите имя «AA».

Отметьте: это не настоящий код, который может работать, но я думаю, что это может выглядеть проще, чем псевдокод.

1

Похоже, что вы хотите интерпретировать некоторое выражение (например AA+BB быть оценивало до 30, так как -or в среде where- AA привязанные к 10 и BB привязанных к 20), используя переменные ваша программа на C (или некоторые другие переменные или bindings).

Я не уверен, что это вообще возможно и разумно (каково поведение, которое вы ожидаете, если пользователь вводит abort()?).

Возможно, вы могли бы встроить какой-либо существующий интерпретатор, например. Guile или Lua, в вашей программе. В противном случае рассмотрите некоторые выражения (вам нужно будет формализовать их синтаксис, например, в BNF, и определить их semantics) в некоторый abstract syntax tree (AST), а затем закодировать интерпретатор для оценки таких АСТ в некоторой среде.

Обратите внимание, что во время выполнения, для скомпилированной программы C, переменная C AA (объявленная в исходном C код в int AA;) больше не существует (известно во время компиляции только не во время выполнения)

Если вы находитесь в Linux, возможно, читайте около dlsym(3) (что может дать вам возможность найти адрес некоторой глобальной переменной или символа во время выполнения, учитывая его имя).

BTW, читать о call stacks & continuations & interpreted languages & eval

+0

переменная все еще существует и известна. ее имя otoh не является – sp2danny

+0

Нет, я утверждаю, что во время выполнения C переменные не существуют. Существуют только * местоположения *. –

Смежные вопросы