0

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?

2
  • 2
    scanf("%d%d", &A[MAXVALUES]... i don't think you really want to mean this. Commented Nov 10, 2014 at 10:56
  • Your scanf looks suspicious Commented Nov 10, 2014 at 10:57

3 Answers 3

1

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

0

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;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.