2017-08-28 1 views
2

Ich habe den folgenden Code geschrieben sortierten Ketten in einem 2-D-Zeichen-ArrayZeichenfeld in der Luftblase Art

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

void swap(char *,char *); 

void main() { 
    char a[20][20]; 
    int Pass = 0, i = 0, j = 0, n; 

    printf("\nHow many elements you want to sort ? >> "); 
    scanf("%d", &n); 
    printf("\n\nEnter the elements to be sorted :\n"); 
    for (i = 0; i < n; i++) 
     scanf("%s", a[i]); 
    for (Pass = 1; Pass < n; Pass++) { 
     for (j = 0; j < n - Pass; j++) 
      if (strcmp(a[j], a[j + 1]) < 0) 
       swap(a[j], a[j + 1]); 
     printf("\n\nPass = %d\n", Pass); 
     for (i = 0; i < n; i++) 
      printf(" %s ", a[i]); 
    } 
} 

void swap(char *a, char *b) { 
    char *t; 
    *t = *a; 
    *a = *b; 
    *b = *t; 
} 

zu bekommen Aber ich Ausgabe als

How many elements you want to sort ? >> 5 
Enter the elements to be sorted : 
1 2 3 4 5 
Pass = 1 
2 3 4 5 1 
Pass = 2 
3 4 5 2 1 
Pass = 3 
4 5 3 2 1 
Pass = 4 
Segmentation fault (core dumped) 

bekommen Warum ich Segmentierung Sie begegnen Fehler? (Der gleiche Code funktioniert einwandfrei, wenn I ein Integer-Array anstelle eines Zeichenfeldes)

+0

Haupt zurückkehren muss 'int ' –

+0

Ihre' swap' Funktion ist falsch. 1) 'char * t; * t = * a; ': Nicht initialisierte Variable verwenden. 2) Was ausgetauscht werden soll, ist ein Array und nicht ein Zeiger (oder ein "char"). – BLUEPIXY

+0

Sparen Sie Zeit, aktivieren Sie alle Warnungen des Compilers: 'char * t; * t = * a; 'sollte warnen, dass' t' vor der Initialisierung verwendet wird. – chux

Antwort

1

Einsprungpunkt mainsollte als

int main() 

oder (mit Argumenten) definiert werden

int main(int argc, char* argv[]) 

aber kann oder kann nicht einen Wert zurückgeben.


In Funktion swap Sie nicht initialisierten Zeiger zugreifen, die undefined behavior verursacht. Es ist nicht notwendig, Zeiger zu verwenden. Verwenden Sie einfach char.

void swap(char *a,char *b) 
{ 
    char t; 
    t=*a; 
    *a=*b; 
    *b=t; 
} 

auch Pufferüberlauf zu vermeiden, Sie scanf(), wie viele Zeichen sagen sollte vom Eingangspuffer

scanf("%19s",a[i]); 

und überprüfen, ob Scan gelungen zu scannen.

Jetzt sollten Sie korrekte Ergebnisse erhalten. Here is fixed code.

+0

C-Spezifikation stimmt nicht mit Ihren begrenzten Stichproben akzeptabler 'main()' Signaturen überein, da andere Implementierungen, nicht UB Signaturen möglich sind. – chux

+0

Danke für Infos. Einmal hat mir jemand gesagt "void main" hat UB und lebt seither in Lügen. –

+2

@ FilipKočica die meiste Zeit 'void main()' wird trotzdem funktionieren. Das Problem hier war offensichtlich der nicht initialisierte Zeiger. –

1

Sie sind in Unordnung im swap Methode mit Zeigern auf. Derzeit tun Sie:

void swap(char *a,char *b) 
{ 
    char *t; 
    *t=*a; 
    *a=*b; 
    *b=*t; 
} 

Diese Linie *t = *a scheint ein sehr aussichtsreicher Kandidat für SEGV zu sein, da t ein Zeichenzeiger ist, der nicht initialisiert ist. Ich lief den Code über GDB und GDB sagte auch dasselbe:

Reading symbols from a.out...done. 
(gdb) run 
Starting program: /home/rohan/Documents/src/a.out 

How many elements you want to sort ? >> 5 


Enter the elements to be sorted : 
1 2 3 4 5 

Program received signal SIGSEGV, Segmentation fault. 
0x0000555555554a21 in swap (a=0x7fffffffdce0 "1", b=0x7fffffffdcf4 "2") at testBubble.c:26 
26  *t=*a; 
(gdb) 

Sie brauchen t nicht als Zeigervariable. Es ist nur eine temporäre Variable, die für den Austausch benötigt wird. So Ihre Methode wie folgt ändern, die die Segmentierungsfehler in meinem Fall behoben:

void swap(char *a,char *b) 
{ 
    char t; 
    t=*a; 
    *a=*b; 
    *b=t; 
} 
0

Die Swap-Funktion ist falsch: Sie dereferencing den nicht initialisierten Zeiger t, was zu undefinierten Verhalten: in Ihrem Fall einen Segmentation Fault.

Sie sollten stattdessen t als char definieren:

void swap(char *a, char *b) { 
    char t; 
    t = *a; 
    *a = *b; 
    *b = t; 
} 

Dies würde aber nur für Worte mit einem einzelnen Zeichen arbeiten.

Um Worte von bis zu 19 Bytes zu tauschen, verwenden Sie diese:

void swap(char *a, char *b) { 
    char t[20]; 
    strcpy(t, a); 
    strcpy(a, b); 
    strcpy(b, t); 
} 

Und einige zusätzliche Tests und Schutz in der main Funktion hinzufügen undefinierten Verhalten zu vermeiden:

int main(void) { 
    char a[20][20]; 
    int Pass = 0, i = 0, j = 0, n; 

    printf("\nHow many elements you want to sort ? >> "); 
    if (scanf("%d", &n) != 1 || n < 0 || n > 20) 
     return 1; 
    printf("\n\nEnter the elements to be sorted :\n"); 
    for (i = 0; i < n; i++) { 
     if (scanf("%19s", a[i]) != 1) 
      return 1; 
    } 
    for (Pass = 1; Pass < n; Pass++) { 
     for (j = 0; j < n - Pass; j++) { 
      if (strcmp(a[j], a[j + 1]) < 0) 
       swap(a[j], a[j + 1]); 
     } 
     printf("\nPass = %d\n", Pass); 
     for (i = 0; i < n; i++) 
      printf(" %s", a[i]); 
     printf("\n"); 
    } 
    return 0; 
} 
Verwandte Themen