Jestem w trakcie pisania programu do sortowania alfabetycznego słów w języku C, dialekcie C99.
Wstępnie kod wygląda tak:
#define _GNU_SOURCE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void usage() {
fprintf(stderr, "Usage: sortlist source target\n");
exit(0);
}
int compare(const char* a, const char* b) {
}
int main(int argc, char** argv)
{
if(argc != 3) usage();
FILE* fp = NULL;
char* line = NULL;
size_t len = 0;
char** words_array = NULL;
int i = 0;
// read list from file
if( ( fp = fopen(argv[1], "r") ) == NULL ) {
fprintf(stderr, "Cannot open source file!\n");
exit(1);
}
for(; getline(&line, &len, fp) != -1; ++i) {
// put word in array
words_array = realloc(words_array, sizeof(char*) * (i + 1) );
words_array[i] = strdup(line);
}
fclose(fp);
free(line);
// sort it
qsort(words_array, i, sizeof(char*), compare);
// display
for(int j = 0; j < i; ++j) printf("Stored data: %s", words_array[j]);
// write to file
// free dynamically allocated memory
for(int j = 0; j < i; ++j)
free(words_array[j]);
free(words_array);
return 0;
}
Myślę o użyciu funkcji z biblioteki standardowej o prototype:
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
Kompilator wyrzuca mi warning:
main.c:43:3: warning: passing argument 4 of ‘qsort’ from incompatible pointer type [enabled by default]
/usr/include/stdlib.h:761:13: note: expected ‘__compar_fn_t’ but argument is of type ‘int (*)(const char *, const char *)’
- Czy można zrobić to za pomocą funkcji qsort?
- Za bardzo nie wiem jak się za to zabrać, będę wdzięczny za wskazówkę - jak mniej więcej powinna wyglądać funkcja porównująca.
Wydaje mi się, że możnaby tu wykorzystać właśności kodów ASCII czy jest jakiś prosty i sprawdzony sposób.
Pozdrawiam,