代码之家  ›  专栏  ›  技术社区  ›  themarksmaker

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

  •  -2
  • themarksmaker  · 技术社区  · 7 年前

    所以我有这个密码:

    #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。 当我运行这个程序时,会出现一个停止工作的错误。

    我有一个从文件中读取数字(整数)的数组,第一行是元素的数量,第二行是元素。 我需要一个变量,比如z来检查一个元素在向量中出现的次数(检查扫描的数字z是否等于一个元素和+1个计数)

    例子:

    在文件中

    4(因为我有4个元素)

    1 2 3 3(我的元素)

    把z扫描成3 Z==3真 计数=1 再一次 计数=2

    2 回复  |  直到 7 年前
        1
  •  1
  •   dbush    7 年前

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

    fscanf("%d", &z);
    

    此函数需要 FILE * 对于第一个参数,您没有指定。可能您想从控制台读取,所以使用 scanf :

    scanf("%d", &z);
    

    第二期:

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

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

    fprintf(g,"%d", functie(v,nr,z));
    
        2
  •  0
  •   JackLThornton    7 年前

    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)通过第一个测试,即整数个条目,则仅对向量执行逻辑。

    推荐文章