2016-09-20 3 views
2

Ich muss n Anzahl der lexikografischen Strings sortieren, die Argumente einer Funktion mit variabler Anzahl von Argumenten sind. In main Funktion werden Zeichenfolgen als Befehlszeilenargumente gelesen.C - Funktion mit variabler Anzahl von Argumenten und Befehlszeilenargumenten

Hier ist mein Code:

#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; 
} 

Wie n Strings als Befehlszeilenargumente in main Funktion zu lesen und sie sortiert drucken?

Auch bekomme ich einen Fehler in der Funktion sort() - redeclaration of args with no linkage.

+0

Sie Befehlszeilenargumente oder Benutzereingaben bedeuten Sie? – ChiefTwoPencils

+0

@ChiefTwoPencils, Befehlszeilenargumente. – ufo

+0

Sie können es nicht tun - nun, nicht ohne erpresserische Schmerzen und eine spezielle Bibliothek. Übergeben Sie das Array von der Befehlszeile an eine geänderte Sortierfunktion, die ein Array verwendet. Der ursprüngliche Code kann dann diese andere Funktion verwenden, um das Array, das er erstellt, aus einer Variablenargumentliste zu sortieren. Das grundlegende Problem besteht darin, dass Sie in einer Funktionsaufruf-Argumentliste zur Laufzeit keine variable Anzahl von Argumenten erstellen können. (Es ist jedoch nicht wirklich klar, was Ihre Sortierfunktion vorhat. Sie sortiert einige Daten, tut aber nichts mit den sortierten Daten.) –

Antwort

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; 
} 

Ausführungsbeispiel:

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

Wäre besser mit ein wenig Erklärung –

+0

@BLUEPIXY, Sie haben keine variable Anzahl von Argumenten verwendet. – ufo

+0

@ufo Es ist nicht erforderlich, wenn Sie die Befehlszeilenargumente 'argc' und' argv' verwenden. (Auch wenn es eine Funktion mit einem variablen Argument gibt, ist es unmöglich, zur Laufzeit Variablenparameter zu übergeben.) – BLUEPIXY

Verwandte Themen