如何在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
相关产品推荐
相关产品推荐

