Home > Blockchain >  C problem where the value assigned to a variable is getting changed even though it hasn't bee
C problem where the value assigned to a variable is getting changed even though it hasn't bee

Time:10-01

Please help me with this strange problem where the input value is given as 4 (i.e. n = 4) and after a for loop the same value is getting displayed as 2, but why? It was not used anywhere (AFAIK) and it shouldn't get changed (I have no clue about it).

The original problem on HackerRank.

MY CODE >>
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */   
    int n;
    int arr[n];
    cin >> n; // input given from stdin is 4
    
    cout << n << "\n"; // outputs 4
    
    for(int i=0; i<n; i  ){
        scanf("%d",&arr[i]);
    }
    
    cout << n << "\n"; // outputs 2 (but why?)
    
    for(int i=n-1; i>=0; i--){
        printf("%d ",arr[i]); // if it were n = 4, then i will go from 3 to 0, but it goes from 1 to 0 (as n=2, but again, why?)
    }
    return 0;
}

Thank you for any help!

CodePudding user response:

int n;
int arr[n];   // <<<<<< I magically know what n will be after the user types it!
cin >> n; // input given from stdin is 4

First of all, that's not even legal in C . As a gcc extension to support C style VLA's, what is the value of n when the array declaration is seen? You have not read it yet!!


Instead, use:

int n;
cin >> n;
std::vector arr(n);

Although this still is not the "C way" as you are pre-defining the entire collection and then assigning to each element in turn; as opposed to adding each element to the collection. This is not a big deal with an int but more generally you don't want dead unused items in a collection; rather they simply don't exist at all.

std::vector arr;  // don't pre-allocate any size
for(int i=0; i<n; i  ){
        int val;
        scanf("%d",&val);   //<<<   uhhhhhh.  you know about `cin` why this?
        arr.push_back(val);
    }
  • Related