2016-11-21 5 views
0

Also habe ich einen Code geschrieben, der Wörter in der richtigen Reihenfolge sortiert. Die Wörter werden über Zeiger gespeichert und ich habe ein anderes Char-Array im Programm initialisiert, um die char* argv zu speichern.printf char array Segmentfehler C

Die letzte for-Schleife ist, was Segmentfehler druckt und ich kann nicht herausfinden, warum.

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

int main(int argc, char* argv[]) { 
    int i, j; 
    char *key; 
    char a[argc-1]; 
    for(i=1; i < argc; i++){ 
    a[i-1]= tolower(argv[i]); 
     } 

    for (i = 2; i < argc; i++) { 
    key = argv[i]; 

    j = i-1; 
    while (j >= 1 && strcmp(argv[j], key) > 0) { 
     argv[j+1] = argv[j]; 
     j--; 
    } 

    argv[j+1] = key; 
    } 

    for(i = 1; i < argc; i++){ 
    a[i-1] = *argv[i]; 
    } 

    for (i = 1; i < argc ; i++){ 
    puts(argv[i]); 
    } 

    for(i = 0; i < argc-1; i++){ 
    printf("%s", a[i]); 
} 
    return 0; 
} 

Eingang

./a.out orange banana apple 

Ausgang

apple 
banana 
orange 
Segmentation fault 
+1

'tolower (argv [i])' sollte eine Warnung vom Compiler rasen, sonst ist es, weil Sie sie nicht aktiviert haben, ignorieren Sie sie überhaupt nicht! Warnungen sind sehr nützlich für Experten, sie müssen ein Werkzeug für Nicht-Experten sein. –

+0

@iharob Ich habe diesen Teil kommentiert. Trotzdem bekomme ich immer noch Segmentfehler. –

+0

Bitte lesen Sie meine Antwort ... Lassen Sie sich von den Kompilierungswarnungen leiten. Ich meine, versuche die Warnungen zu verstehen und folge daraus, wie die Dinge funktionieren. –

Antwort

0

Ihr Compiler sollten Sie auch einen warnging geben:

printf("%s", a[i]); 

Warnung: Format gibt den Typ 'char *', aber das Argum an ent hat 'char' [-Wformat]

eingeben Wenn Sie ändern, dass ein zu %c funktioniert es feinen.

Wie die Warnung sagt, wenn Sie es verwenden %s printf erwartet eine Zeichenfolge oder char* und wird es als solche behandeln. a[i] ist ein Integer-Typ, der auf einen ungültigen Speicherort im Speicher verweisen kann. Der richtige Weg wäre also, entweder% c zu verwenden und ein Zeichen auszudrucken; oder verwenden Sie% s und übergeben Sie ein char * als zweites Argument.

Oder vielleicht möchten Sie Args in a. Ändern Sie die Delkaration.

char *a[argc-1]; 

Dann ändern Sie die Zuordnung.

+0

Ihre Antwort scheint das eigentliche Problem nicht zu erklären, sie bietet einen Code-Fix. 'Wenn Sie das zu einem Prozentsatz ändern, funktioniert cit gut. Ist nicht wirklich eine Antwort. – Michi

+0

@Michi es kann verbessert werden. Ich denke, das eigentliche Problem war, dass sie ein Array von char * wollten, aber stattdessen hatten sie nur einen char, und das% c-Verhalten zu diskutieren erscheint ein wenig irrelevant. – matt

1

Es gibt mehrere Probleme in Ihrem Code

  1. Die Linie a[i - 1] = tolower(argv[i]) falsch ist, weil tolower() 0 nimmtals Parameter und Sie übergeben char *, so dass es einen Zeiger auf int konvertiert, die in c zulässig ist, aber kein definiertes Verhalten garantiert.

  2. Sie sind nicht die '\0' Terminator auf der a Array Einstellung, die für Probleme eine andere Ursache ist, insbesondere, wenn Sie versuchen, es als eine Zeichenfolge zu verwenden, ein char Array, es sei denn kein String ist, dann ist es eine Folge von druckbaren Bytes mit ein abschließendes '\0' Byte.

  3. argc - 1 Allokierung wird nicht funktionieren, weil

    • Der Wert argc die Anzahl der übergebenen Parameter an die ausführbare Datei ist.
    • Wenn es die Länge der entsprechenden argv wie von strlen() gefunden hätte, müssten Sie 1 Byte nicht weniger, also wäre es in jedem Fall argc + 1.
0

Warum verwenden Sie% s

for(i = 0; i < argc-1; i++){ 
printf("%s", a[i]); 

try% c

+0

% c würde nur den ersten Buchstaben jedes Wortes drucken. –

+0

Sollte Ihr a char nicht sein * a [argc] eher als char a [argc] – Sniper

+0

Nein, weil argc ist 4 im Falle einer Eingabe, dass 3 Worte. argc zählt auch main() –