c - 为什么 fscanf/scanf 正在更改 Ideone.com 上先前扫描的变量的值?

标签 c variables scanf

我在 Ideone.com 上写了一个简单的代码。变量 f 的值在执行命令 fscanf 后发生变化,以获取下一行的输入字符串。

#include <stdio.h>

int main()
{
    FILE* fp = stdin;
    int i=0, f,arr[3], count =0;
    char inp[3];
    for(i=0;i<3;i++)
    {
        arr[i]=0;
    }
    fscanf(fp, "%d\n", &f);
    printf("%d\n", f);
    for(i;i<f;i++)
    {
        printf("%d\n", f);
        fscanf(fp , "%s\n", inp);
        printf("%d\n", f);
        if(inp[2]=='2')
            arr[1]++;
        else if(inp[0]=='1')
            arr[0]++;
        else
            arr[2]++;
    }
    printf("%d %d %d %d\n",f, arr[0], arr[1], arr[2]);
return 0;
}

我提供的输入是

10
3/4
3/4
3/4
3/4
3/4
3/4
3/4
3/4
3/4
3/4

但是在第一次 scanf 之后,f 的值从 10 变为 0。

最佳答案

考虑到终止空字符,分配给 inp 的大小太小了。似乎 f 发生 就在 inp 之后并且您的机器正在使用小端,所以空字符发生要写到f的第一个字节,10小于255,所以f<的值 零。请注意,将数据写入超出范围的数组将调用未定义的行为,因此任何事情都有可能发生。

要修复,请为 inp 分配足够的缓冲区。

关于c - 为什么 fscanf/scanf 正在更改 Ideone.com 上先前扫描的变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725679/

相关文章:

C 数组的行为因位数不同而不同,为什么?

c - 将dll文件和c-exe文件打包到一个文件中

php - 检查 $_COOKIE 值是否为空

我可以通过 OCI 函数获取 SID ("Oracle Session Id"吗?

c - 静默运行 Windows 控制台应用程序(禁止控制台出现)

c - 变量文件名和 Curlib

php - 通过 ajax 和 jquery 将变量发送到 php

c - scanf 把文件指针放在哪里?

无法让 fscanf 在简单程序中正确执行

c - 如果我在 scanf 函数中将 "&"与字符串一起使用会怎样?