2016-04-15 3 views
0

Ich erstellte eine Funktion "Sortieren nach Datum", die ordnungsgemäß funktioniert. Beim Versuch, die Funktion "Sortieren nach Name" zu erstellen, ging ich davon aus, dass die Funktion "Sortieren nach Datum" kopiert und die Variable JahrTmp in NameTemp geändert wurde, um nach Namen zu sortieren. Es tut nicht. Programm läuft, aber ich diese Fehler in dem Compiler zu sehen ...Sortierfunktion mit einem String-Array - Fehler in C

[Warning] assignment makes integer from pointer without a cast 
[Warning] assignment makes pointer from integer without a cast 

Code I bisher haben ...

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

#define MAX 30 

void sortByDate(int year[], char *name[], char *states[], int count); 
void sortByName(int year[], char *name[], char *states[], int count); 

int main() 
{ 
    int year[MAX]; 
    int i, a; 
    int count = 0; 
    int choice; 
    char *name[MAX], 
      *states[MAX]; 
    char b[MAX], c[MAX]; 

    FILE *inp = fopen("hurricanes.txt","r");    /* defining file input */ 

    for(i=0;i<MAX;i++) 
    { 
     if(feof(inp)) 
     { 
      break; 
     } 

     fscanf(inp, "%d %s %29[^\n]", &a, b, c); 
     year[i]=a; 
     name[i] = strdup(b); 
     states[i] = strdup(c); 
     ++count; 

     printf("%d %s %s\n", year[i], name[i], states[i]); 
    } 

    printf("Press 0 to sort by date or 1 to sort by name: "); 
    scanf("%d", &choice); 
    if (choice == 0) 
    { 
     sortByDate(year, name, states, count); 
    } 
    else if (choice == 1) 
    { 
      sortByName(year, name, states, count); 
    } 

    getch(); 
    return 0; 
} 

void sortByDate(int year[], char *name[], char *states[], int count) 
{ 
    int d = 0; 
    int c = 0; 

    int yearTmp; 
    int order[count]; 
    int tmp = 0; 

    FILE *outp = fopen("report.txt","w");     /* defining file output */ 

    for (c = 0; c < count; ++c) 
    { 
     order[c] = c; 
    } 

    for (c = 0 ; c < (count - 1); c++) 
    { 
      for (d = 0 ; d < count - c - 1; d++) 
      { 
       if (year[d] > year[d+1]) 
       { 
        yearTmp = year[d]; 
        year[d] = year[d+1]; 
        year[d+1] = yearTmp; 

        tmp = order[d]; 
        order[d] = order[d+1]; 
        order[d+1] = tmp; 
       } 
      } 
    } 

    for (c = 0; c < count; ++c) 
    { 
      printf("%d %-10s %s\n", year[c], name[order[c]], states[order[c]]); 
    } 
} 

void sortByName(int year[], char *name[], char *states[], int count) 
{ 
    int d = 0; 
    int c = 0; 

    char nameTmp; 
    int order[count]; 
    int tmp = 0; 

    FILE *outp = fopen("report.txt","w");     /* defining file output */ 

    for (c = 0; c < count; ++c) 
    { 
     order[c] = c; 
    } 

    for (c = 0 ; c < (count - 1); c++) 
    { 
      for (d = 0 ; d < count - c - 1; d++) 
      { 
       if (name[d] > name[d+1]) 
       { 
        nameTmp = name[d]; 
        name[d] = name[d+1]; 
        name[d+1] = nameTmp; 

        tmp = order[d]; 
        order[d] = order[d+1]; 
        order[d+1] = tmp; 
       } 
      } 
    } 

    for (c = 0; c < count; ++c) 
    { 
      printf("%d %-10s %s\n", year[order[c]], name[c], states[order[c]]); 
    } 
} 

Die hurricanes.txt Datei ....

1960 Donna FL, NC 
1969 Camille MS 
1972 Agnes FL 
1983 Alicia TX 
1989 Hugo SC,NC 
2005 Katrina FL, LA, MS 
2005 Rita TX, LA 
2005 Wilma FL 
2008 Ike TX 
2009 Ida MS 
2011 Irene NC, NJ, MA, VT 
2012 Isaac LA 
1992 Andrew FL, LA 
1995 Opal FL, AL 
1999 Floyd NC 
2003 Isabel NC, VA 
2004 Charley FL, SC, NC 
2004 Frances FL 
2004 Ivan AL 
2004 Jeanne FL 
+0

'nameTmp = name [d];': Typ von 'name [d]' ist 'char *', aber Typ von 'nameTmp' ist' char'. Auch 'if (name [d]> name [d + 1])', Verwenden Sie 'strcmp' anstelle von. – BLUEPIXY

+1

Ich merke, dass Sie nicht wissen, wie man Strings in 'C' vergleicht. Lesen Sie die Manpage für 'strcmp' –

Antwort

1

Sie haben den richtigen Pfad angegeben, aber Sie können C-Strings nicht wie Ganzzahlen behandeln.

Eine Zeichenkette in C ist ein Array von Zeichen, die mit dem Nullabschlusszeichen '\ 0' abgeschlossen werden. Um sie zu vergleichen, müssen Sie jedes Element des Arrays überprüfen. Zum Glück existiert eine Funktion, die das für Sie tut, nämlich strcmp()

Was Sie in Ihre Funktion übergeben, ist ein Array von char *. Jeder dieser Indizes zeigt auf ein Array von Zeichen, die Ihre Strings darstellen. Um diese Indexe zu vergleichen, können Sie Folgendes tun.

// Returns 0 if the are equal 
// Returns something > 0 if pName[d] is lexicographically greater than pName[d+1] 
// Returns something < 0 if pName[d] is lexicographically less than pName[d+1] 
if(strcmp(pName[0], pName[d+1]) > 0) 

Es ist sehr wichtig, dass beide Strings Null abgeschlossen sind oder diese Funktion hat undefiniertes Verhalten.

Um den Swap-Teil des Sortieralgorithmus auszuführen, tauschen Sie die Zeiger aus.

+0

Danke, das half und arbeitete perfekt! – codeRed