2016-09-20 43 views
2

n可変数の引数を持つ関数の引数である文字列を辞書順にソートする必要があります。 main関数では、文字列はコマンドライン引数として読み込まれます。ここでC - 可変数の引数とコマンドライン引数を持つ関数

は私のコードです:

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

void sort(int n,...) 
{ 
    //store optional arguments (strings) to array arr 
    va_list args; 
    va_start(args,n); 
    char **arr=malloc(n * sizeof(char*)); 
    int i; 
    for(i=0;i<n;i++) 
     arr[i]=malloc((strlen(va_arg(args,char*)) + 1) * sizeof(char)); 
    va_end(args); 

    //store length of each string to lenArr 
    //find max length and store it to temp (for sorting) 
    va_list args; 
    va_start(args,n); 
    int *lenArr=calloc(n , sizeof(int)); 
    for(i=0;i<n;i++) 
    { 
     lenArr[i]=strlen(va_arg(args,char*)) + 1; 
    } 

    int max=0; 
    for(i=0;i<n;i++) 
    { 
     if(lenArr[i] > lenArr[max]) 
      max=i; 
    } 
    int maxLen; 
    maxLen=lenArr[max]; 
    char *temp=calloc(maxLen * sizeof(char)); 
    va_end(args); 

    //sort array arr lexicographically 
    int j,min; 
    for(i=0;i<n-1;i++) 
    { 
     for(min=i,j=i+1;j<n;j++) 
      if(strcmp(arr[j],arr[min]) < 0) 
       min=j; 
      if(min!=i) 
      { 
       strcpy(temp,arr[i]); 
       strcpy(arr[i],arr[j]); 
       strcpy(arr[j],temp); 
      } 
    } 
} 

int main(int argc,char **argv) 
{ 
    int n=3; 
    sort(n,argv[1],argv[2],argv[3]);//this works when n is pre-defined 


    return 0; 
} 

main機能にコマンドライン引数としてn文字列を読み、ソートされたそれらを印刷する方法は?

また、機能のエラーが発生しています。sort() - redeclaration of args with no linkage

+0

次のコマンドライン引数またはユーザー入力を意味していますか? – ChiefTwoPencils

+0

@ChiefTwoPencils、コマンドライン引数。 – ufo

+0

あなたはそれをすることはできません - 強引な痛みや特別な図書館がないわけではありません。コマンドラインの配列を、配列をとる変更されたソート関数に渡します。元のコードは、この他の関数を使用して、可変引数リストから作成した配列の並べ替えを実行できます。基本的な問題は、実行時に関数呼び出し引数リストに可変数の引数を構築できないことです。 (しかし、あなたのソート関数が何であるかは本当に明確ではありません。いくつかのデータをソートしますが、ソートされたデータは何もしません)。 –

答えて

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

int cmp(const void *a, const void *b){ 
    return strcasecmp(*(char**)a, *(char**)b); 
} 

void sort(int n, char *str[n]){ 
    qsort(str, n, sizeof(char*), cmp); 
} 

int main(int argc, char *argv[]){ 
    sort(argc-1, argv+1); 
    for(int i = 1; i < argc; ++i) 
     puts(argv[i]); 
    return 0; 
} 

実行例:

>a.out a B c Z x y 
a 
B 
c 
x 
y 
Z 
+0

少しの説明でもっとうまくいくだろう。 –

+0

@BLUEPIXY、可変数の引数を使わなかった。 – ufo

+0

@ufoコマンドライン引数として 'argc'と' argv'を使用する必要はありません。 (また、引数が可変な関数があっても、実行時に可変パラメータを渡すことはできません)。 – BLUEPIXY

関連する問題