C Program 'stuck' After Accepting Input

2019-07-28 16:39发布

问题:

Sorry for the wording of the title, I could not think of a better way to word my question. In my code I am taking n sets of input for a struct I call interval. If the user only wants to enter 1 structure, then the program accepts input and prints just fine. However, anything greater than 1 will accept all the input, but after the last input that stores an integer inside the structure, it will become 'stuck' where the cursor will move down one line as if it is waiting for input. Except no matter what you enter the program doesn't progress at all. I need to understand what is stopping my program from progressing. Thanks for any and all help.

The error (I assume) is in the main when the function takeInput is called.

I compiled using gcc on a Linux machine. Below is the Code.

#include <stdio.h>

typedef struct interval{
    int num_left, denum_left;
    int num_right, denum_right;
    int left_state, right_state;
}interval;

interval combine(interval x, interval y);
int combineCheck(interval x, interval y);
int valueCheck(interval x, interval y);
void mergeSort(interval x[], int l, int r);
void merge(interval x[], int l, int m, int r);
interval takeInput();

int main(){
    int response, i;
    char d;
    printf("Enter the number of intervals to input: ");
    scanf("%d", &response);
    interval data[response];

    for(i = 0; i < response; i++){
        data[i] = takeInput();
    }
    printf("%d/%d   %d/%d", data[0].num_left, data[0].denum_left, data[0].num_right, data[0].denum_right);

    mergeSort(data, 0, response-1);

    printf("%d/%d   %d/%d", data[0].num_left, data[0].denum_left, data[0].num_right, data[0].denum_right);
}

interval takeInput(){
    interval temp;
    printf("Enter left numerator: ");
    scanf("%d", &temp.num_left);
    printf("Enter left denominator: ");
    scanf("%d", &temp.denum_left);
    printf("Enter right numerator: ");
    scanf("%d", &temp.num_right);
    printf("Enter right denominator: ");
    scanf("%d", &temp.denum_right);
    printf("\n");

    if(temp.num_left < 0){
        temp.num_left = temp.num_left*-1;
        temp.left_state = -1;}
    else{
        temp.left_state = 0;}

    if(temp.num_right < 0){
        temp.num_right = temp.num_right*-1;
        temp.right_state = -1;}
    else{
        temp.right_state = 0;}
    printf("Testing Shit");
    return temp;
}

int combineCheck(interval x, interval y){
    int left, right;
    left = x.num_right * y.denum_left;          //used to find relationship between 2 fractions
    right = y.num_left * x.denum_right;

    if(left == right && (x.right_state + x.left_state) == 0){
        return 1;
    }
    else if(left > right){
        return 1;
    }
    return 0;
}

interval combine(interval x, interval y){
    int left, right;                        //used to check if one interval is all encompassing
    left = x.num_right * y.denum_right;
    right = x.denum_right * y.num_right;

    interval temp;
    temp.num_left = x.num_left;
    temp.denum_left = x.denum_left;
    temp.left_state; 
    if(left > right){
        temp.num_right = x.num_right;
        temp.denum_right = x.denum_right;
        temp.right_state = x.right_state;
        return temp;
    }
    temp.num_right = y.num_right;
    temp.denum_right = y.denum_right;
    temp.right_state = y.right_state;
    return temp;
}

int valueCheck(interval x, interval y){
    int first, second;                  //used to check values
    first = x.num_left * y.denum_left;
    second = y.num_left * x.denum_left;
    if(first > second){
        return 1;
    }
    return -1;
}

void mergeSort(interval x[], int l, int r){
    if(l < r){
        int m = l + (r-1)/2;

        mergeSort(x, l, m);
        mergeSort(x, m+1, r);
        merge(x, l, m, r);
    }
}

void merge(interval arr[], int l, int m, int r){
    int i, j, k;
    int n1 = m-l +1;
    int n2 = r-m;

    interval L[n1], R[n2];

    for(i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for(j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];
    j = 0;
    i = 0;
    k = l;
    while(i < n1 && j < n2){
        if(valueCheck(L[i], R[j]) == -1){
            arr[k] = L[i];
        }
        else{
            arr[k] = R[j];
            j++;
        }
    }

    while(i < n1){
        arr[k] = L[i];
        i++;
        k++;
    }

    while(j < n2){
        arr[k] = R[j];
        j++;
        k++;
    }
}

Here is what the output looks like

回答1:

You have some problem in your merge sort routine:

k = l;
while(i < n1 && j < n2){
    if(valueCheck(L[i], R[j]) == -1){
        arr[k] = L[i];
    }
    else{
        arr[k] = R[j];
        j++;
    }
}

You're not incrementing i after assigning to arr. Since i is never changing, your while loop never terminates. Add a i++ in that first if condition and it would work. Also see the point made by MondKin, that's also a very serious problem in your code.



回答2:

Checking your merge sort algorithm I see this:

int m = l + (r-1)/2;

I think you meant:

int m = l + (r-l)/2;

Because what you want is the middle index.



回答3:

There is an infinite loop problem as others indicate. You cannot indicate this in your debug prints, because it may not flush whenever they are called. You can add newline to your debug prints to see where your program stucks.



回答4:

I think that the middle index m is incorrect.

Change this:

int m = l + (r-1)/2;

to this:

int m = (l + r) / 2;


标签: c sorting input