1

对C非常陌生,所以请多多包涵。我有一个函数,它接受 3 个 char * 变量opcodearg1arg2.

arg1 和 arg2 可以是 (1) 包含持有无符号整数的变量名称的字符串,或 (2) 实际整数。

无论哪种方式,我都需要得到实际的整数。到目前为止,我正在尝试使用 atoi,但它似乎在第一种情况下返回 0。

IE

sscanf(instruction, "%s %s %s", opcode, arg1, arg2);

sum = atoi(arg1) + atoi(arg2);

我不能发布整个代码,因为它不属于我,但希望上面的演示有点帮助?

4

3 回答 3

3

正如我在评论中所说,你不能指望在运行时检索命名变量的值,在 C 中。变量名称不是在代码运行时保留的东西,而是纯机器代码,所有变量都有被“煮熟”到内存地址。名字已经不在了。

atoi()函数将包含整数的字符串(例如"4711",)转换为实际值,4711。这就是它所做的一切,它不能以任何方式“按名称”检索值。

如果您希望在程序运行时拥有一种将变量名映射到值的机制,那么您将不得不自己创建该机制,因为该语言没有. 例如,您可以创建某种结构数组,让您将名称与值相关联,但这当然需要您初始化该数组。

像这样的东西:

int foo = 12;
char *vname = "foo";

print("the value of %s is %d\n", vname, get_variable_value(vname));

根本不会在 C 中发生,该函数get_variable_value() 不能存在

于 2012-06-01T09:36:57.707 回答
0

变量名仅在编译时使用。一旦程序被编译,所有关于您使用的名称的信息都会丢失1。因此,您无法在运行时通过包含变量名称的“字符串”访问变量内容。2

1更准确地说,它们可用于链接器或调试器,但这不是您可以使用(或指望)的东西

2我可以想到一种(可怕的)方法来使用宏或使用所有变量名称到它们的地址的映射,但我相信你的程序需要通过设计来修复。

于 2012-06-01T09:40:52.127 回答
0

您必须创建一个数据结构,在其中放置变量及其值。在您使用的库中查找“哈希映射”。

然后你可以用它isdigit(arg[0])来检查参数是数字还是变量名。伪代码:

sum = toInt(arg1) + toInt(arg2)

int toInt(char * arg) {
    return isdigit(arg[0]) ? atoi(arg) : map->lookupValue(arg);
}
于 2012-06-01T09:42:08.600 回答