gpt4 book ai didi

c - 为什么我的 fscanf() 不读取中间变量?

转载 作者:行者123 更新时间:2023-11-30 18:40:39 25 4
gpt4 key购买 nike

这可能是一个非常简单的修复,但我没有看到它。假设我的文件如下所示:

Katze cat 1
Hund dog 1
Fisch fish 3

我用它来阅读它:

char a[1000], b[1000];
unsigned box;
while(fscanf(in, "%s %s %u", a, b, &box) == 3) {

然后,为了检查,我立即将其放在后面:

printf("\njust read: '%s' '%s' '%u'", a, b, box);

我得到的输出是这样的:

just read: 'Katze' '' '1'
just read: 'Hund' '' '1'
just read: 'Fisch' '' '3'

我不知道第二根字符串去了哪里。

<小时/>

为了满足更多代码的请求:

if(argc==3 && (!strcmp(argv[1], "test"))){

//try to open the 3rd argument, to read.
if((in = fopen(argv[2], "r")) == NULL){
printf("\n%s: cannot open '%s'\n", argv[0], argv[2]);
exit(1);
}

//read data from .fee file.
while(fscanf(in, "%s %s %u", a, b, &box) == 3) {

printf("\njust read: '%s' '%s' '%u'", a, b, box);
<小时/>

更新:我修复了它,但我仍然不明白为什么错误会以这种方式表现出来。问题是,事实上,我将“box”定义为一个字符,而不是一个无符号字符,正如我上面所说的那样。当我更改此设置时,代码可以完美运行。

有什么想法为什么会导致它忽略第二个字符串但仍然拾取整数吗?

最佳答案

如果您将“box”定义为字符(1 个字节),则 fscanf 仍将向该地址写入 4 个字节(因为 fscanf 格式中有 %u)。数据类型与 fscanf 格式类型不匹配会导致缓冲区溢出。

当fscanf运行时,它会将数据写入“a”缓冲区,然后将数据写入“b”缓冲区,然后将数据写入“box”内存。由于“box”为其保留了 1 个字节(字符),但 fscanf 写入了 4 个字节(无符号整数),因此存在溢出。

在第一行的情况下,fscanf 会将字节 0x01、0x00、0x00、0x00 写入“box”。如果“b”缓冲区位于堆栈上的“box”之后,则 3 个零将覆盖“b”中的前 3 个字节,并且“b”将是一个空字符串,而不是您在那里的数据。

将“box”更改为无符号整数后,它现在为其保留了 4 个字节,并且不会发生溢出。

关于c - 为什么我的 fscanf() 不读取中间变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25389028/

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