Ok, you've got an array of structures.
But you also have an structure of arrays:
struct data Students[NO_OF_STUDENTS]; // 20 students.
You do not need both, but you will need to leave the name as is (if 20 bytes is enough). I recommend the array of structures.
Additionally, you haven't defined NO_OF_STUDENTS, but you also have magic numbers of 20 for your arrays. I recommend defining these numbers symbolically.
Since age and weight are ints, you don't need to have:
scanf("%19d", Students[Counter].age); // Extract 19 characters,
Also, scanf needs the address of the variable it is to store the input.
scanf("%d", Students[Counter].age); // Extract 19 characters.
There is also the issue with setting Counter to 0 outside of a for loop. Don't even bother with a for loop in this case. A do/while will do what you need. Have the while condition look for an end condition (20 records input or a terminating signal of some kind).
Once you have input working, you can work on the sorting aspect.