C 程序在使用 scanf 而不是 var=0 后停止工作

C Program stopped working after using scanf instead of var=0

所以我有这个代码:

#include <stdio.h>
#include <stdlib.h>

int functie ( int v[], int nr, int z)
{
    int i,count;
    scanf("%d", &z);
    for(i=0;i<nr;i++) {
        if(z==v[i]) {
            count=count+1;
        }
    }
    return z;
}

int main()
{
    int i,nr,z;
    fscanf("%d", &z);
    FILE *f;
    FILE *g;
    f=fopen("data-in.txt", "r");
    fscanf(f,"%d",&nr);
    int *v=malloc(nr*sizeof(int));
    for(i=0;i<nr;i++) {
        fscanf(f,"%d",&v[i]);
    }
    g=fopen("data-out.txt", "w");
    fprintf(g,"%d %d", functie(v,nr,z));
    fclose(f);
    fclose(g);
    free(v);
}

在我有 int z=0; 之前而不是尝试扫描我的 var z。 当我 运行 这个时,我得到一个停止工作的错误。

我有一个数组,其中包含从文件中读取的数字(整数),第一行是元素的数量,第二行是元素的数量。 我需要一个 var 让我们说 z 来检查一个元素在向量中出现了多少次(检查扫描的数字 z 是否等于一个元素和 +1 计数)

示例:

在文件中

4(因为我有 4 个元素)

1 2 3 3(我的元素)

比将 z 扫描为 3 z==3 真 计数=1 再次 数=2

这里有两个问题,都在 main 中。第一:

fscanf("%d", &z);

此函数需要 FILE * 作为您未指定的第一个参数。大概你想从控制台读取,所以使用 scanf:

scanf("%d", &z);

第二期:

fprintf(g,"%d %d", functie(v,nr,z));

您的格式字符串需要两个整数参数,但您只传入了一个。去掉额外的格式说明符:

fprintf(g,"%d", functie(v,nr,z));

fscanf 不会被换行分隔。最好的办法是使用 fgets 一次吃掉一行文件。因此,在 main 的顶部添加一个行缓冲区:

char line[16];  // assuming integers will actually be small

使用 'f' 打开文件后:

if (fgets(line, sizeof(line), f))
{
    int count = atoi(line);
    int *v = (int *) malloc(count * sizeof(int));
    for (int i = 0; i < count && fgets(line, sizeof(line), f); ++i)
    {
        v[i] = atoi(line);
    }
}

你绝对应该在上面添加错误检查,这是最小的并且仅用于概念(例如防止错误输入、缓冲区溢出、异常、计数错误在数组末尾留下未初始化的整数等。 ) 因为这只有在您的输入文件完美时才有效。请注意,对于行缓冲区来说,16 通常是一个小得离谱的长度。如果 (a) 文件打开,并且 (b) 通过第一个测试,这是整数个条目,也只对你的向量执行逻辑。