I’m trying to solve some exercises in preparation for an incoming test and i’ve encountered a problem that i’ve fixed by chance and i’d like to understand what’s going on with my code.
The exercise requires me to create a struct type that represent a monomial of 4 variables (x, y, w and z) and two functions, print_term that will show the monomial on screen and read_term, that take an user input and returns a monomial. The exercise requires the user input to be of the form “C V P V P V P V P .”, where C is the coefficient of the monomial, V is one of the 4 variables (in any order) and P is their power.
//Here is the monomial struct
struct term{
    int coef;
    int potx;
    int poty;
    int potw;
    int potz;
};
My problem lies in the read_term function: sometimes, if C is negative the power of one of the variables will be set to -48 (which definitely come from my attempt to convert the char that represent a digit to it’s value in int): for example, the input “-257 x 2 z 3 w 1 .” will return me -257(x^2)(w^-48)(z^3), while “257 x 2 z 3 w 1 .” will instead return the correct result 275(x^2)w(z^3).
struct term read_term(){
    struct term result;
        result.coef =0;
        result.potx =0;
        result.poty =0;
        result.potw =0;
        result.potz =0;
        
    char input[255];
    for(int i =0; i < sizeof(input)/sizeof(input[0]);i++){
        input[i] = '\0';
    }
    char inputNeg[255];
    int negativo = 0;
    printf("Termine: \n");      
                            
    fgets(input, 255, stdin);
    input[strlen(input)-1] = '\0';      //should remove '\n'
    //I remeve the minus sign, i'll add it back in later.
    if(input[0] == '-'){
        negativo = 1;
        int i = 1;
        do{
            inputNeg[i-1] = input[i];
            i++;
        }while(input[i] != '\0');   
        printf("\n%s\n", input);
        strcpy(input, inputNeg); 
        printf("\n%s\n", input);   
    }
   
    ////////////THIS MAKE OR BRAKE THE CODE
    
    //printf("\ninput prova\n");
    for(int i =0; i < sizeof(input)/sizeof(input[0]);i++){
       //printf("%c", input[i]);
    }
    ////////////////////////////
    //Change struct term result based on input:
    int index = 0;
    int cifreCof[12];
    for(int j=0; j< sizeof(cifreCof)/sizeof(cifreCof[0]);j++){
                cifreCof[j] = 0;
    }
    int temp = 0;
    int pot = 0;
    do{
        //Coeff is always at index 0
        if(index == 0){
            //Conversion from char to int
            do{
            cifreCof[index] = input[index] - '0';
            index++;
            pot++;
            }while(input[index] != ' ');
            //Puts all the digits in one int
            for(int i=0; i < sizeof(cifreCof)/sizeof(cifreCof[0]); i++){
                temp = temp + (cifreCof[i]*pow(10, pot-1));
                pot--;
            }
            //Place the minus sign back.
            if(negativo == 0){
                result.coef = temp;
            }
            else{
                result.coef = (-1)*temp;
            }
           
        }
        // Variabili.
        else{
            //White space
            if(input[index] == ' '){
                index++;
            }
            //x char
            else if(input[index] == 'x'){
                index++;
                index++;
                //per ora mi limito ad esponenti a una cifra
                if(input[index] != '.'){
                    result.potx = input[index] - '0';
                    index++; 
                }
                else{index++;}
            }
            //y char
            else if(input[index] == 'y'){
                index++;
                index++;
                //per ora mi limito ad esponenti a una cifra
                if(input[index] != '.'){
                    result.poty = input[index] - '0';
                    index++; 
                }
                else{index++;}
            }
            // w char
            else if(input[index] == 'w'){
                index++;
                index++;
                //per ora mi limito ad esponenti a una cifra
                if(input[index] != '.'){
                    result.potw = input[index] - '0';
                    index++; 
                }
                else{index++;}
            }
            //z char
            else if(input[index] == 'z'){
                index++;
                index++;
                //per ora mi limito ad esponenti a una cifra
                if(input[index] != '.'){
                    result.potz = input[index] - '0';
                    index++; 
                }
                else{index++;}
            }
            else{index++;}
        }
    }while(input[index] != '\0');
       
    return result;
}
In an attempt to identify the problem, i placed a for loop to print the array i use to save the input, just to discover that this loop changed the outcome of the function to the correct result: i decided to keep the loop but emptying it of its code, and still the result is correct. I have no idea how it fix my code but it does. Any explanation?
 
     
    