sscanf()跳过定界符和宽度

时间:2018-11-05 03:23:41

标签: c pointers file-io printf scanf

我正在编写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,名称和模式变量还是有问题。

1 个答案:

答案 0 :(得分:0)

实际上,不是sscanf有问题。由于缓冲区溢出,您有不确定的行为-printf不知道您的字符串不是以空字符结尾的事实,并且它将继续打印字符,直到找到'\0'

要阻止它这样做,您可以在格式说明符中提供最大字段宽度:

printf("%.3s,%.3s,%.2s,%d\n", name, mode, op, bytes);