首页 > 解决方案 > fscanf 仅获取十六进制数的前 4 个字节

问题描述

我正在用 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 行打印出错误的地址。而不是“地址:7ff000398”,它写入“地址:ff000398”。第 1 行它是正确的。为什么它只读取前 4 个字节?'address' 已经很长了,我找不到任何关于 %x 行为的文档。

标签: cscanf

解决方案


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

要修复它,您可以将地址类型更改为long long


推荐阅读