2012-06-01 106 views
1

对C很新颖,请耐心等待。我有一个函数需要3个char *变量,opcode,arg1arg2atoi from char *在C中返回0 0

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

无论哪种方式,我需要得到实际的整数。我想尽可能使用atoi,但它似乎在第一种情况下返回0。

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

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

我不能发布,因为它不属于我,但希望上述示范有助于一点点整个代码?

+0

请发送代码。 – Abhineet

+1

你应该展示一些实际的代码,而不是用英文来描述它,这很难用C的精度来表达。听起来好像你期望在运行时通过名称来获取变量的值,这是你在C中不容易做的事情。 – unwind

+0

刚刚添加了一个例子,但我宁愿避免发布大量代码,因为它不属于我。 – James

回答

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()不能存在

+0

明白了,谢谢!将在5分钟内打勾答案。 – James

0

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

更确切地说,它们可用于链接或可能的调试器,但是这不是你可以使用(或计数)

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

0

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

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

sum = toInt(arg1) + toInt(arg2) 

int toInt(char * arg) { 
    return isdigit(arg[0]) ? atoi(arg) : map->lookupValue(arg); 
} 
+0

这个问题在C.'map-> lookupValue(arg)''不会在'lookupValue'函数中得到'map'本身。另外,问题不是要求输入脚本中的变量,而是原始程序本身中的变量。 – Shahbaz

+1

@Shahbaz - 这个答案也在C中! :) - 我认为答案是一种合理的方式,可以在* any *语言中进行名称 - >值映射。即它看起来像OP应该使用的那种东西,如果那是他们想要实现的东西,你不觉得吗? – ArjunShankar

+0

我不知道他可能想在哪里存储'map'。也许全局变量对他的用例来说已经足够了。或者他可以将这些代码移动到'map'的'lookupValue()'方法中并传递给它。或者,也许他已经拥有了一种他通过大多数方法的上下文结构。 –