在我正在处理的程序中,我想允许用户输入程序将转换为预定义数字的符号名称。
例如,如果用户键入AA
,则程序将使用值10
,但如果用户键入BB
,则程序将使用值20
。< / p>
如何将字符串转换为数字?
答案 0 :(得分:4)
您需要使用查找表。使用scanf
读取字符串,然后调用lookup函数将字符串转换为值。
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 :(得分:2)
您可以创建一个包含名称的数组和一个包含相应值的数组,例如
char *a[10] = {"AA", "BB", ...};
int b[10] = {10, 20, ...};
然后你对一个char *指针执行scanf,例如命名为input,然后你可以迭代数组a来查找索引,然后检索数组b中的相应索引:
for (i = 0; i < 10; i++)
{
if (!strcmp(input, a[i]))
break;
}
if (i != 10)
value = b[i];
然后通过输入名称&#39; AA&#39;来获得值。
注意:它不是可以运行的真实代码,但我认为它看起来可能比伪代码简单。
答案 2 :(得分:1)
看起来你想解释某个表达式(例如AA+BB
被评估到30,因为-or在一个环境中 - {{1}绑定到10并且AA
绑定到20),使用C程序的变量(或其他一些变量或bindings)。
我不确定它通常是否可行和合理(如果用户键入BB
,您期望的行为是什么?)。
也许你可以嵌入一些现有的翻译,例如您的计划中Guile或Lua。否则,请考虑parsing一些表达式(您需要将其语法形式化,例如在BNF中并将其semantics定义为)abstract syntax tree(AST),然后编译解释器在某些环境中评估此类AST。
请注意,在运行时,对于已编译的C程序,C变量abort()
(在C源代码中声明为AA
)不再存在(仅在编译时才知道,而不是在运行时)
如果您使用的是Linux,或许请阅读dlsym(3)(这可能会让您能够在运行时找到某个全局变量或符号的地址,并给出其名称)。
BTW,请阅读call stacks&amp; continuations&amp; interpreted languages&amp; eval
答案 3 :(得分:0)
scanf
是你应该使用的c函数