gpt4 book ai didi

c - fscanf 仅获取十六进制数的前 4 个字节

转载 作者:行者123 更新时间:2023-11-30 14:39:16 27 4
gpt4 key购买 nike

我正在用 C 语言编写一个缓存模拟器,并且一切都已完成......除了当我尝试扫描地址时,fscanf 会跳过十六进制数字中的一些数字:它只会获得 4 个字节!如果我无法获得正确的地址,则标记位不正确,并且模拟将不总是有效。这个任务看起来很简单,但我一定错过了一些东西。也许与 fscanf 格式字符串特性有关?

源文件如下所示:

 S 00600aa0,1
I 004005b6,5
S 7ff000398,8
M 7ff000390,8
// and so on ...

我尝试使用 fgets 和 sscanf 代替,但得到了相同的结果。

char buffer[200];
char *pattern = " %c %x,%s\n";
int status; long address; char op;
while ((status = fscanf(source, pattern, &op, &address, buffer)) != EOF) {
if (op != 'I') {
fprintf(stderr,"address: %x\n",address); // DEBUG stmnt
simulate the cache..........................

调试语句打印出第 3 行的错误地址。它写的是“address: ff000398”,而不是“address: 7ff000398”。第 1 行的结果是正确的。为什么它只读取前 4 个字节? “地址”已经很长了,我找不到任何关于 %x 行为的文档。

最佳答案

address 变量的类型为 long,只能存储 4 个字节,而 0x7ff000398 则为 8 个字节。因此它只存储最后 4 个有效字节并忽略最重要的字节。这就是第 1 行和第 2 行按预期工作但第 3 行却不能按预期工作的原因。

要解决此问题,您可以将地址类型更改为long long

关于c - fscanf 仅获取十六进制数的前 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56164194/

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