0

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

4 に答える 4

3

のマニュアルページにqsort(3)は、あなたが望むことを正確に実行する1つの例が含まれています。また、その理由についても説明します。

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

要約:qsort()最初の引数で1レベルの参照が欠落しており、sort()関数内で1レベルの逆参照が欠落しています。

于 2010-09-14T08:36:28.460 に答える
3

最初の引数はargv+optind、ソートされるシーケンス内の最初の要素のアドレスであるため、 にする必要があります。

于 2010-09-14T08:10:11.713 に答える
1

問題は argv 配列の構造にあります。

このような構造になっています

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

qsort 関数は、すべての要素が同じサイズであると想定していますが、この場合はそうではありません。のサイズを指定しますがargv[optind]、すべての要素がそのサイズであるとは限りません。

編集:私は間違っていました。文字列の長さをqsortに渡すのではなく、ポインターの長さを渡します。したがって、argv にはポインターの配列が含まれます。目標は、ポインターをソートすることです。

つまり、ポインターの配列を qsort に渡し、sort 関数はポインターを予期する必要があります。このような:

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

qsort(argv+optind, argc - optind, sizeof(argv[optind]), sort);
于 2010-09-14T08:20:40.467 に答える
0

これが私のソートの試みです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 1 2 3 4 5 6 7
i:1 ==>'5'
i:2 ==>'4'
i:3 ==>'1'
i:4 ==>'7'
i:5 ==>'6'
i:6 ==>'3'
i:7 ==>'2'
于 2010-09-14T08:44:31.890 に答える