我有一系列汇编代码,我试图解析成不同的指令。 我的测试文件是
main: add $s0,$s1,$s2
nor $t0,$t1,$t2
addi $t0,$t1,50
arr [i] .inst将填充指令,选项卡,然后是每行的地址。基本上,每个arr [i] .inst都以add nor和addi开头 声明
if ((sscanf(arr[i].inst, "%[add]add", temp) == 1)
printf("add");
将成功打印"添加"每次添加指令出现。但是我怎么能这样做它不会从addi读取添加?这是两条指令,我需要将addi排除在外,所以下面这个不同的if语句将测试addi并打印它
答案 0 :(得分:2)
正如我在评论中所说:
如果输入包含
add
,a
,da
以及dad
和a
的其他序列,则代码将打印d
。格式字符串中的尾随add
永远不会匹配,但是sscanf()
的调用无法告诉您。你试图做错了。您应该考虑扫描"%[a-z]"
,然后将字符串与各种选项进行比较。对每种指令类型进行sscanf()
扫描不是一种好的工作方式,但这似乎就是你正在尝试的方法。
假设操作码必须全部为小写,并且它们都不超过19个字符且操作码中的字符都是基本的拉丁字母,那么这可能是您之后的事情:< / p>
char opcode[20];
if ((sscanf(arr[i].inst, " %19[a-z]", opcode) == 1)
{
if (strcmp(opcode, "add") == 0)
printf("%s\n", opcode);
else if (strcmp(opcode, "addi") == 0)
printf("%s\n", opcode);
else if …
}
else
{
…handle error…
}
格式中的领先空间跳过领先的空间; %[…]
个扫描集,%c
和%n
是唯一不会自动跳过前导空格的转化说明符。
您可能会认为您应该担心作为操作码出现的超长名称;有sscanf()
方法可以处理它们,但我可能不会将它用于此工作。我使用了一些令牌化代码。我不会使用strtok()
,但可以使用外部机会strtok_r()
或strtok_s()
;我更有可能使用strspn()
。
找到操作码匹配的代码也需要认真的工作。它应该从有效操作码名称表中驱动,可能按排序顺序,因此可以使用二进制搜索来查找匹配项。将存在与该表相关联的辅助信息,以告知识别代码在操作码之后有效。