我在 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/