我正在编写6502的汇编器,并尝试从我准备的文件中读取指令和操作码数据。使用sscanf
来存储数据,它只能部分工作...
文件:
ADC,Im,69,2
ADC,ZP,65,2
ADC,ZPx,75,2
ADC,Ab,6D,3
ADC,Abx,7D,3
ADC,Aby,79,3
...
这里只是与问题相关的代码的一部分。 fgets
工作正常。问题行在下方评论。如果需要,将上传更多。
代码:
FILE *fp = ...
char bf[15];
char name[3];
char mode[3];
char op[2];
int bytes;
while (fgets(bf,15,fp)) {
//below is the problem line
sscanf(bf, "%3[^,],%3[^,],%2[^,],%d", name, mode, op, &bytes);
}
printf("%s,%s,%s,%d\n", name, mode, op, bytes);
输出:
ADCIm,Im,69,2
ADCZP,ZP,65,2
ADCZPx75,ZPx75,75,2
ADCAb,Ab,6D,3
ADCAbx7D,Abx7D,7D,3
...
预计为(就像文件格式一样)
ADC,Im,69,2
ADC,ZP,65,2
ADC,ZPx75,75,2
ADC,Ab,6D,3
ADC,Abx7D,7D,3
...
看来op和bytes都可以正常工作,但是即使我在参数中包含了width和delimiter,名称和模式变量还是有问题。
答案 0 :(得分:0)
实际上,不是sscanf
有问题。由于缓冲区溢出,您有不确定的行为-printf
不知道您的字符串不是以空字符结尾的事实,并且它将继续打印字符,直到找到'\0'
。
要阻止它这样做,您可以在格式说明符中提供最大字段宽度:
printf("%.3s,%.3s,%.2s,%d\n", name, mode, op, bytes);