Reputation: 1
I'm currently having problems with my qsort. I'm trying to sort an array of strings I read from a file in the qsort function. I want it to be read alphabetically, but it isnt working. I would've liked to attached my file as well, but it is very long. This is my code:
int sammenlign_hold(const void *p1, const void *p2) {
rytterdata2017 *resultat1 = (rytterdata2017 *)p1;
rytterdata2017 *resultat2 = (rytterdata2017 *)p2;
if (strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold) == 0)
return strcmp(resultat1 -> rytterFornavn, resultat2 -> rytterFornavn);
else
return strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold);
}
void opgave_2(rytterdata2017 *alle_rytterdata2017) {
rytterdata2017 arr[100];
int k = 0;
int i = 0;
for (i = 0; i < PERSONER; i++) {
if(strcmp(alle_rytterdata2017[i].nationalitet, "DEN") == 0) {
strcpy(arr[k].rytterFornavn, alle_rytterdata2017[i].rytterFornavn);
strcpy(arr[k].rytterhold, alle_rytterdata2017[i].rytterhold);
k++;
}
}
qsort(arr, k, sizeof(alle_rytterdata2017), sammenlign_hold);
for (int i = 0; i < k; i++) {
printf("%s %s \n", arr[i].rytterhold, arr[i].rytterFornavn);
}
}
Upvotes: 0
Views: 441
Reputation: 141030
The problem is with the parameter size passed to qsort function.
sizeof(alle_rytterdata2017)
will give you size of a pointer to rytterdata2017.
qsort
however sorts data that are of rytterdata2017
size. You should pass sizeof(arr[0])
or sizeof(rytterdata017)
to qsort
.
Please include more source code, with struct definitions for future questions.
I have written the following code for testing:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char rytterhold[20];
char nationalitet[20];
char rytterFornavn[20];
} rytterdata2017;
int sammenlign_hold(const void *p1, const void *p2) {
rytterdata2017 *resultat1 = (rytterdata2017 *)p1;
rytterdata2017 *resultat2 = (rytterdata2017 *)p2;
int temp;
if ((temp = strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold)) == 0)
return strcmp(resultat1 -> rytterFornavn, resultat2 -> rytterFornavn);
else
return temp;
// strcmp(resultat1 -> rytterhold, resultat2 -> rytterhold);
// tip: don't call strcmp twice, it is cpu extensive
}
void opgave_2(rytterdata2017 *alle_rytterdata2017, size_t PERSONER) {
rytterdata2017 arr[100];
int k = 0;
int i = 0;
for (i = 0; i < PERSONER; i++) {
if(strcmp(alle_rytterdata2017[i].nationalitet, "DEN") == 0) {
strcpy(arr[k].rytterFornavn, alle_rytterdata2017[i].rytterFornavn);
strcpy(arr[k].rytterhold, alle_rytterdata2017[i].rytterhold);
k++;
}
}
// qsort(arr, k, sizeof(alle_rytterdata2017), sammenlign_hold); // no error, but sizeof(alle_rytterdata2017) is ont size of the object stored in arr
qsort(arr, k, sizeof(arr[0]), sammenlign_hold);
// or qsort(arr, k, sizeof(*alle_rytterdata2017), sammenlign_hold);
// or qsort(arr, k, sizeof(alle_rytterdata2017[0]), sammenlign_hold);
// or qsort(arr, k, sizeof(rytterdata2017), sammenlign_hold);
// on my machine:
// sizeof(alle_rytterdata2017) = 8
// sizeof(*alle_rytterdata2017) = sizeof(rytterdata2017) = 60
for (int i = 0; i < k; i++) {
printf("%s %s \n", arr[i].rytterhold, arr[i].rytterFornavn);
} }
int
main ()
{
rytterdata2017 arr[] = {
{"c","DEN","b"},
{"a","DEN","e"},
{"c","DEN","a"},
{"d","DEN","c"},
{"d","DEN","a"},
{"b","DEN","a"},
};
opgave_2(arr, sizeof(arr)/sizeof(arr[0]));
return 0;
}
Which produces:
a e
b a
c a
c b
d a
d c
Upvotes: 1
Reputation: 713
Program below sorts array of strings using pointer to strcmp
function which compares strings alphabetically. Before this just read from file into str
array.
int main () {
int i;
char str[3][10] = {"one", "two", "three"};
qsort(str, 3, 10, (int(*) (const void*, const void*)) strcmp);
for(i = 0; i < 3; i++) {
printf("%s\n", str[i]);
}
return 0;
}
Upvotes: 0