gpt4 book ai didi

c - fscanf() 的输出无效

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

我使用的语言是C我正在尝试从文件中扫描数据,代码段如下:

char lsm;
long unsigned int address;
int objsize;
while(fscanf(mem_trace,"%c %lx,%d\n",&lsm,&address,&objsize)!=EOF){
printf("%c %lx %d\n",lsm,address,objsize);
}

我读取的文件的第一行如下:

 S 00600aa0,1
I 004005b6,5
I 004005bb,5
I 004005c0,5
S 7ff000398,8

标准输出中显示的结果是:

  8048350 134524916
S 600aa0 1
I 4005b6 5
I 4005bb 5
I 4005c0 5
S 7ff000398,8

显然,结果多了一行,却无处可去。有人知道这是怎么发生的吗?谢谢!

最佳答案

这对我来说适用于您提供的数据:

#include <stdio.h>

int main(void)
{
char lsm[2];
long unsigned int address;
int objsize;
while (scanf("%1s %lx,%d\n", lsm, &address, &objsize) == 3)
printf("%s %9lx %d\n", lsm, address, objsize);
return 0;
}

有多项更改。最简单且最不重要的是从 fscanf()scanf() 的更改;这是为了我的方便。

一个重要的变化是 lsm 的类型从单个 char 变为两个字符的数组。然后,格式字符串使用 %1s 将一个字符(加上 NUL '\0')读取到字符串中,但它也会(这一点至关重要)跳过前导空格。

另一个变化是在条件中使用 == 3 而不是 != EOF。如果出现问题,scanf() 将返回成功匹配的数量。假设它成功读取了一封信,但接下来的不是十六进制数字;它会返回 1(不是 EOF)。此外,它会在每次迭代中返回 1,直到找到与十六进制数字匹配的内容为止。始终测试您期望的值的数量。

输出格式已使用 %9lx 进行整理。我正在 64 位系统上进行测试,因此 9 位十六进制转换得很好。 scanf() 的一个问题是,如果转换发生溢出,则行为是未定义的。

输出:

S    600aa0 1
I 4005b6 5
I 4005bb 5
I 4005c0 5
S 7ff000398 8

为什么你会得到这样的结果?

第一次转换将一个空格读入lsm,但随后未能将S转换为十六进制数字,因此它被留在下一个循环中。因此,您在地址和对象大小列中打印了剩余的垃圾。第二次迭代读取 S,然后与数据同步,直到最后一行。格式末尾的换行符(与格式字符串中的任何其他空格一样)会占用空格,这就是为什么尽管有前导空格,最后一行仍然有效。

关于c - fscanf() 的输出无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11200335/

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