noobprogrammer132
noobprogrammer132

Reputation: 5

Sorting an array in C

I'm trying to sort elements in an array from smallest to largest that a user inputs along with the size. This is my code so far:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXVALUES 20

void sort(int *A[], int n) {
    int i, tmp, j;
    for (i = 0; i <= (n - 2); i++) {
        for (j = (i + 1); j <= (n - 1); j++) {
            if (*A[i] > *A[j]) {
                tmp = *A[i];
                *A[i] = *A[j];
                *A[j] = tmp;
            }
        }
    }
    return;
}

int main(int argc, char *argv[]) {
    int n, A[MAXVALUES], i;
    printf("Enter an array and no. of elements in array: ");
    scanf("%d%d", &A[MAXVALUES], &n);
    sort(A[MAXVALUES], n);
    printf("Ordered array is: \n"); 
    for (i = 0; i <= (n - 1); i++) {
        printf("  %d", A[i]);
    }
    return 0;
}

The compiler compiles it without any errors but it stops working after I put in the inputs. I've yet to quite grasp the theory behind arrays and pointers so could someone tell me where in my code I'm going wrong?

Upvotes: 0

Views: 94

Answers (3)

BușuiMatei
BușuiMatei

Reputation: 32

Firstly I'll tell you a couple of things about your sorting function. What you want, is take an array (which in C is representable by a pointer to the type of elements that are in that array, in your case int) and the array's size(int) (optionally you can take a sorting method as an argument as well, but for simplicity's sake let's consider you want to sort things from lowest to highest). What your function takes is a pointer to an array of integers and an integer (the second argument is very much correct, or in other words it's what we wanted), but the first is a little more tricky. While the sorting function can be wrote to function properly with this argument list, it is awkward and unnecessary. You should only pass either int A[], either int *A. So your function header would be:

void sort1(int *A, int n);
void sort2(int A[], int n);

If you do this however, you have to give up some dereferencing in the function body. In particular I am referring to
if (*A[i] > *A[j]) { tmp = *A[i]; *A[i] = *A[j]; *A[j] = tmp; } which should become
if (A[i] > A[j]) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; }

You should check out the operators [] and *(dereference) precedence http://en.cppreference.com/w/c/language/operator_precedence
Now, to adapt to these changes (and further correct some code) your main would look like so:

int main(int argc, char *argv[])
{
int A[MAXVALUES], n;
do{
printf("n="); scanf("%d", &n);
}while(n < 0 || n > 20);
int i;
for(i = 0; i < n; ++i)
scanf("%d", &A[i]); //this will read your array from standard input
sort(A, n); //proper sort call
for(i = 0; i < n; ++i)
printf(" %d", A[i]);
printf("\n"); //add a newline to the output
return 0;
}

Upvotes: 0

bitcell
bitcell

Reputation: 941

scanf("%d%d", &A[MAXVALUES], &n); is the problem

That's not how you read an array. First you read the n, after that inside a loop you read every element like scanf("%d", &A[i]); where i is the index from 0 to n

EDIT:

scanf("%d", &n);

int i = 0;

for(i = 0; i < n; i++)
{
    scanf("%d", &A[i]);
}

This is what you want.

Upvotes: 1

unwind
unwind

Reputation: 399703

You can't use scanf() to read in a whole array at once.

This:

scanf("%d%d", &A[MAXVALUES], &n);

Makes no sense; it passes scanf() the address of the element after the last one in A, causing undefined behavior. The sort() call is equally broken.

To read in multiple numbers, use a loop. Also, of course you must read the desired length first, before reading in the numbers themselves.

Upvotes: 1

Related Questions