You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言scanf()的否定扫描集中加入方括号?

scanf否定扫描集添加方括号的正确做法

你的代码失效核心是没搞对scanf扫描集里方括号的处理规则,还有分隔符匹配太死板。直接给你解决办法:

核心规则

在scanf的否定扫描集%[^...]里:

  • 要把]加入排除列表,必须放在[^之后的第一个位置,不然会被当成扫描集的结束标记
  • [可以直接丢进扫描集里,不用额外转义
  • 原代码里用固定的空格加逗号 ,匹配分隔符,但实际输入里逗号前后可能有空格、方括号,得灵活跳过这些无效字符

修正后的代码

针对你要处理的两种汇编指令格式,改成这样就能正常提取:

void ReadBuffer(const char* buffer)
{
    char command[2048];
    char var[3][2048];
    // 先抓命令,然后跳过所有分隔符(空格、逗号、方括号等),再依次抓三个操作数
    sscanf(buffer, "%[^]\n\t ,[]]%*[^a-zA-Z0-9]%[^]\n\t ,[]]%*[^a-zA-Z0-9]%[^]\n\t ,[]]%*[^a-zA-Z0-9]%[^]\n\t ,[]]",
           command, var[0], var[1], var[2]);
}

逐段解释

  • %[^]\n\t ,[]]:这个扫描集表示只匹配不是]、换行、制表符、空格、逗号、[的字符,刚好能提取指令名、寄存器、立即数这些有效内容
  • %*[^a-zA-Z0-9]:*是跳过匹配内容的意思,这里用来跳过所有非字母数字的分隔符,不管是逗号、空格还是方括号,都能跳过,不用纠结分隔符的位置

测试效果:

  • 输入mov r0, r1, r2:提取出command="mov",var[0]="r0",var[1]="r1",var[2]="r2"
  • 输入ldr r0, [r1, 0x4]:提取出command="ldr",var[0]="r0",var[1]="r1",var[2]="0x4"

内容的提问来源于stack exchange,提问作者TylerD007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:00:37