Как отсортировать элементы argv в C? - PullRequest
0 голосов
/ 14 сентября 2010

Я пытаюсь отсортировать элементы argv в алфавитном порядке.

Следующая строка кода доставляет мне проблемы:

qsort(argv[optind], argc - optind, sizeof(argv[optind]), sort);

В частности, последний аргумент доставляет мне проблемы, функция сравнения, которая приводится ниже:

int
sort(const void *a, const void * b)
{    
    return(strcmp( (char*)a, (char*)b ));
}

На данный момент, он прекрасно компилируется, но я получаю ошибку сегментации при запуске.

Ответы [ 4 ]

3 голосов
/ 14 сентября 2010

Страница man для qsort(3) содержит один пример, который делает именно то, что вы хотите. Это также объясняет, почему:

http://linux.die.net/man/3/qsort

Резюме: вам не хватает одного уровня ссылок на первый аргумент qsort(), и один уровень разыменования внутри функции sort().

3 голосов
/ 14 сентября 2010

Первый аргумент должен быть argv+optind, так как это адрес первого элемента в последовательности для сортировки.

0 голосов
/ 14 сентября 2010

Вот моя попытка сортировки argv

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

int mycomp(const void *a, const void *b) {
  /* function code removed to prevent homework copy/paste */
}

int main(int argc, char **argv) {
  int i;
  qsort(argv + 1, argc - 1, sizeof *argv, mycomp);
  for (i = 1; i < argc; i++) printf("i: %d ==> '%s'\n", i, argv[i]);
  return 0;
}

и пример запуска программы

$ ./a.out one two three four five six seven
i: 1 ==> 'five'
i: 2 ==> 'four'
i: 3 ==> 'one'
i: 4 ==> 'seven'
i: 5 ==> 'six'
i: 6 ==> 'three'
i: 7 ==> 'two'
0 голосов
/ 14 сентября 2010

Проблема в структуре массива argv.

Он имеет такую ​​структуру

program\0arg1\0argument2\0a3\0\0

Функция qsort предполагает, что все элементы имеют одинаковый размер, но в этом случаеони не.Вы указываете размер argv[optind], но не все элементы имеют такой размер.

Редактировать : я ошибся, вы не передаете длину строки в qsort, а длинууказатели.Таким образом, argv содержит массив указателей.Цель состоит в сортировке указателей.

Это означает, что вы передаете массив указателей в qsort, и функция сортировки должна ожидать указатель.Как это:

int
sort(const void *a, const void * b)
{
    return(strcmp( *(char**)a, *(char**)b ));
}

qsort(argv+optind, argc - optind, sizeof(argv[optind]), sort);
...