2016-04-15 24 views
0

正常に動作する「日付順のソート」関数を作成しました。しかし、 'sort by name'関数を作成しようとすると、 'sort by date'関数をコピーし、変数yearTmpをnameTmpに変更することで、名前で並べ替えることになりました。それはしません。プログラムの実行が、私は、コンパイラでは、これらのエラーを見ています...私はこれまで持って文字列配列を使用したソート関数 - Cのエラー

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

コード...

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

hurricanes.txtファイル....

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

'name [d];' 'name [d]'の型は 'char *'ですが、 'nameTmp'の型は' char'です。 'if(name [d]> name [d + 1])'の代わりに 'strcmp'を使います。 – BLUEPIXY

+1

私はあなたが 'C 'で文字列を比較する方法を知らないと感じています。 'strcmp'のマンページを読む –

答えて

1

あなたは正しいパスを開始しましたが、整数のようにc-stringを扱うことはできません。

Cの文字列は、ヌルターミネータ '\ 0'で終わる文字の配列です。それらを比較するには、配列のすべての要素をチェックする必要があります。幸いなことに、strcmp()のような関数が存在します。

あなたが関数に渡すものは、char *の配列です。これらのインデックスのそれぞれは、文字列を表す文字の配列を指しています。これらのインデックスを比較するには、次の操作を行います。

// 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) 

両方の文字列がヌルで終了するか、この関数の動作が未定義であることが非常に重要です。

ソートアルゴリズムのスワップ部分を実行するには、ポインタを入れ替えます。

char * pTemp = pName[d]; 
pName[d] = pName[d+1]; 
pName[d+1] = pTemp; 
+0

ありがとう、これは完璧に助けられた! – codeRed

関連する問題