2016-04-25 14 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int string_cmp(const void *p, const void *q); 

int main(int argc, char **argv) 
{ 
    int i; // variable 
    char **words_array = malloc(sizeof(char*)*(argc+1)); // sets new array to hold the words 
    char *p; // another char pointer array 
    p = *words_array;  // set both equal to eachother 

    for(; *p < (argc - 1); p++) // for loop 
    { 
      p = malloc(strlen(*argv) + 1); // determines size based on user input 
      argv++; // increments 
      strcpy(p++, *argv); // copies words to the new array 

    } 
    p = NULL; // resets p 

    qsort(words_array, argc-1, sizeof(char *), string_cmp); // sorts the array 
    for(i = 0; i < argc - 1; i++){ // for loop to print properly 
      printf("%s ", words_array[i]); 
    } 
    printf("\n"); 
    return 0; 
    } 

int string_cmp (const void *p, const void *q) // compares the two different   strings and returns a value 
{ 
    const char *value = *(const char**)p; 
    const char *value_two = *(const char**)q; 

    return strcmp(value, value_two); 
} 

Also mein Programm soll Kommandozeilenargumente übernehmen und sie sortiert mit Qsort zurückgeben. Beispiel wäre "./a.out hallo Dunkelheit mein alter Freund sollte als Dunkelheit Freund Hallo mein altes zurückgegeben werden. Ich bekomme keine Compilerfehler, aber stattdessen bekomme ich einen Segmentierungsfehler und ich bin mir nicht sicher, wie ich das beheben soll . meine Pointer-ArithmetikPointer Arithmetische Segmentierung Ausgabe

+1

' p = * words_array; 'Wo ist malloc für' words_array'? – sjsam

+0

Warum deklarieren Sie words_array als Zeiger auf einen Zeiger? – RamblinRose

+1

@sjsam malloc ist genau dort, wenn ** words_array – EnglishStudent62

Antwort

-1

Sie Doppelzeiger sind Inkrementieren (argv), dh,

for(; *p < (argc - 1); p++) // for loop 
{ 
     p = malloc(strlen(*argv) + 1); // determines size based on user input 
     argv++; // increments 
     strcpy(p++, *argv); // copies words to the new array 

} 

so, es ändern (* argv) ++

+0

Haben Sie getestet? nach dem Ändern funktioniert es? – granmirupa

+0

Immer noch den Segmentierungsfehler – EnglishStudent62

-1

Dies sind irgendwie Vorschläge:

Änderung char** argv zu char* argv[]

argc gibt den einen mehr zurück als die tatsächliche Anzahl der übergebenen Argumente. Die zusätzliche Anzahl bezieht sich auf den Namen der ausführbaren Datei.

So ist es gut, einige Fehlerprüfung zu tun, Do:

argc--; 
if(argc > 0) // We have some arguments 
{ 
/* Do something 
* char **words_array = malloc(sizeof(char*)*(argc+1) 
* may be changed to 
*/ 
    char **words_array; 
    words_array=malloc(argc*sizeof(char*)); 
/* Coming down 
* You could change that for-loop to something like this. 
*/ 
for(int i=0;i<argc;i++) 
    words_array[i]=argv[i]; // You have all the arguments stored in words_array 
/* Now go on sort words_array 
* and so and so forth 
*/  

} 
+0

Warum dekrementieren Sie den argc am Anfang? – EnglishStudent62

+0

Sollen Sie './Ihr_Programm_Name Romeo Julia' übernehmen, dann gibt argc 3 zurück.' Argc' zählt auch 'Ihr_Programm_Name'. Also habe ich es am Anfang dekrementiert, um es der tatsächlichen Anzahl von Parametern gleich zu machen. – sjsam

+0

okay, noch eine Frage, ich habe Char ** words_array gleich malloc und all das sollte ich nicht doppelt ** verwenden? Oder gibt es einen Grund, warum du gerade einen benutzt hast? – EnglishStudent62

-1

Das Problem in der for-Schleife ist. Sie vergleichen *p mit argc, was bedeutungslos ist. Ersetzen Sie die Schleife durch den Standardzähler i.

for (i = 1; i < argc; i++) 

Bitte beachten Sie, dass an Stelle von argc - 1 sollte es argc verwendet werden, und die Schleife soll Start von 1 und nicht von 0. Außerdem in der Schleife beginnen können Sie argv[i] anstelle von *argv

+0

Ich brauche Zeigerarithmetik, so kann ich das nicht verwenden – EnglishStudent62