【发布时间】:2019-04-08 10:18:28
【问题描述】:
我正在为 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 都可以正常工作,但是 name 和 mode 变量有问题,即使我在参数中包含了宽度和分隔符。
【问题讨论】:
-
经验教训 -- (1) 所有字符串都需要 nul-termination,(2) 不要吝啬缓冲区大小! 如果最大您预期的字段是
3使用16如果您认为您的最大行可能是300字符,则将缓冲区大小设置为1024; (3) 记住,缓冲区太长10,000字节总是比1字节太短更好。 -
@DavidC.Rankin 谢谢,吸取了教训:)
-
另外,总是,总是,检查
scanf函数族的返回值。否则,解析错误将使程序中的一切变得混乱(例如,由于未初始化的变量带有随机数据)。解析错误可能是由您从未注意到的格式字符串中的错误或您忘记考虑的有效输入引起的,而不仅仅是因为输入格式错误。
标签: c pointers file-io printf scanf