gpt4 book ai didi

c - sscanf() 跳过分隔符和宽度

转载 作者:行者123 更新时间:2023-11-30 16:26:09 25 4
gpt4 key购买 nike

我正在为 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 都工作正常,但是名称和模式变量有问题,即使我在参数中包含了宽度和分隔符。

最佳答案

实际上,问题不在于 sscanf。由于缓冲区溢出,您有未定义的行为 - printf 对您的字符串不是空终止这一事实一无所知,并且它将继续打印字符,直到找到 '\0'.

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

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

关于c - sscanf() 跳过分隔符和宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53147902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com