首页 > 解决方案 > scanf 返回 0,即使输入已给出

问题描述

我正在尝试读取具有以下格式的整数列表(每个数字后面都有一个空格)

8 6 
2 
5 
3 
7 
3 
5

但是,当我尝试阅读它时,数字 2 始终为 0。

编辑:我认为我不需要完整的代码,但这里有完整的代码来重现。

#include <stdio.h>
int main(){
    int n; //=8
    scanf("%d", &n);
    int m; //=6
    scanf("%d", &m);
    int input_arr[m];
    int fenwick[n];

    //Makes input array
    for(int i = 0; i < m; i++){
        int v;
        scanf("%d",&v);
        input_arr[i] = v;
    }
    
    //Initializes fenwick tree
    for(int i = 1; i < n+1; i++){
        fenwick[i]=0;
    }
    
    printf("%d \n", input_arr[0]); //prints 0

    printf("%d %d\n",n,m); //prints 8 and 6
    
    for(int i = 0; i < m; i++){
        printf("%d ",input_arr[i]); //prints 0 5 3 7 3 5 
    }

    return 1;
}

标签: cscanf

解决方案


您的问题来自不正确的 for 循环。当您执行以下操作时:

for(int i = 1; i < n+1; i++){
        fenwick[i]=0;
    }

它正在覆盖 array 的第一个元素input_arr。将您的 for 循环修复为:

for(int i = 0; i < n; i++){
        fenwick[i]=0;
    }

它应该可以工作。您需要阅读堆栈分配的工作原理。

另外,请尝试以下操作:

for(int i = 2; i < n+2; i++){
    fenwick[i]=0;
}

这应该覆盖两个元素。

您可以尝试的另一件事是更改两个数组的声明顺序,即使您的 for fenwick 数组的循环错误,它也会起作用。


推荐阅读