如何使用sscanf分别读取字符串的子字符串

时间:2017-02-04 20:53:54

标签: c scanf

我有一系列汇编代码,我试图解析成不同的指令。 我的测试文件是

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并打印它

1 个答案:

答案 0 :(得分:2)

正如我在评论中所说:

  

如果输入包含addada以及dada的其他序列,则代码将打印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()

找到操作码匹配的代码也需要认真的工作。它应该从有效操作码名称表中驱动,可能按排序顺序,因此可以使用二进制搜索来查找匹配项。将存在与该表相关联的辅助信息,以告知识别代码在操作码之后有效。