2012-08-09 57 views
1

我想使用排序功能的年級,這將排序「名姓midterm1」,但我不知道如何分配名稱和姓氏字符串到臨時數組。有任何想法嗎?分配字符串的東西

void student_swap(struct student *x){ 
    int z,y,temp; 
    char temp2[15]; 
    for(z=0; z<10; z++){ 
     for(y=0; y<9; y++){ 
      if(x[y].mid1>x[y+1].mid1){ 
       temp = x[y+1].mid1; 
       x[y+1].mid1 = x[y].mid1; 
       x[y].mid1 = temp; 

       strcpy (temp2,x[y+1].name); 
       strcpy (x[y+1].name,x[y].name); 
       strcpy (x[y+1].name,temp2); 
       strcpy (temp2,x[y+1].surname); 
       strcpy (x[y+1].surname,x[y].surname); 
       strcpy (x[y+1].surname,temp2); 

      } // if 
     } // for 
    } // for 
} //student_swap 

排序int值工作正常,但strcpy什麼都不做。 這是我出來把代碼

for (i=9;i>=0;i--){ 
    ; 
    printf ("%s %s %d\n",x[i].name,x[i].surname,x[i].mid1); 
} 
printf ("\n"); 

     student_swap(x); 

    for (i=9;i>=0;i--){ 
    ; 
    printf ("%s %s %d\n",x[i].name,x[i].surname,x[i].mid1); 
} 

,這是我的輸出

murat hot 73 
mehmet umur 72 
idil saracoglu 55 
ecem bektas 75 
sevde pir 70 
asli devecioglu 65 
can akkurt 45 
levent dogan 60 
anil erdiz 30 
ali durmus 40 

murat hot 75 
mehmet umur 73 
idil saracoglu 72 
ecem bektas 70 
sevde pir 65 
asli devecioglu 60 
can akkurt 55 
levent dogan 45 
anil erdiz 40 
ali durmus 30 
+0

您確定strcpy無能爲力嗎?你寫了一個strcpy的測試嗎?你在使用調試器嗎? – 2012-08-09 15:19:11

+0

是的,我是編程新手,我不知道如何使用調試器。我發佈代碼的其餘部分,輸入和輸出。 – Cagurtay 2012-08-09 15:25:35

+0

另外:像'x,y,z'這樣的變量名很難讀取。特別是當'x'是與'y'和'z'不同的類型時,甚至當'x'是一個參數而'y,z'是自動的時更是如此。對於'temp'和'temp2'同上。 'temp'本身就沒有問題,但是當你開始使用'temp2'等(以及不同的類型)時,它很難在後面讀取,並知道發生了什麼。 – ArjunShankar 2012-08-09 15:29:33

回答

3

它不應該是:

strcpy (temp2,x[y+1].name); 
    strcpy (x[y+1].name,x[y].name); 
    strcpy (x[y].name,temp2); // <-- note the index used 

同樣爲姓氏。

+0

哦.....謝謝你邁克爾它修好了。 – Cagurtay 2012-08-09 15:33:05

+0

@ÇağatayCanKaraahmetoğlu - 歡迎來到StackOverflow。如果答案適用於您,您應該考慮將其標爲「正確」。 [以下是你的操作方法](http://meta.stackexchange.com/a/65088/179533)。 – ArjunShankar 2012-08-09 15:53:53

+0

謝謝你,我做到了。 – Cagurtay 2012-08-09 15:57:20

0

在學習編程時,實施自我排序是一種很好的練習。但是,在編寫生產代碼時,最好避免重新發明輪子。例如,您可以使用,它隨附stdlib.h

#include <stdio.h> 
#include <stdlib.h> 

struct student { char name[100]; char surname[100]; int mid1;}; 

int compare_students (const void *a, const void *b) 
{ 
    struct student *sa, *sb; 
    sa = (struct student *) a; 
    sb = (struct student *) b; 

    if (sa->mid1 > sb->mid1) 
    return -1; 
    if (sa->mid1 == sb->mid1) 
    return 0; 

    return 1; 
} 

int main (void) 
{ 
    int i; 
    struct student s[4] = { 
          {.name = "a", .surname = "e", .mid1 = 10}, 
          {.name = "b", .surname = "f", .mid1 = 20}, 
          {.name = "c", .surname = "g", .mid1 = 99}, 
          {.name = "d", .surname = "h", .mid1 = 70} 
         }; 
    qsort (s, 4, sizeof (struct student), compare_students); 
    for (i = 0; i < 4; i++) 
    printf ("%s %s: %d\n", s[i].name, s[i].surname, s[i].mid1); 
    return 0; 
} 
+0

這是我的作業,我們被要求創建我們的功能並使用它。 – Cagurtay 2012-08-09 15:55:22

+0

@Curturtay - 我完全明白這一點。這就是爲什麼我寫'*寫代碼時*'的原因。我寫了這個答案,所以其他人試圖寫自己的排序*見*這一點。 – ArjunShankar 2012-08-09 15:57:11

相關問題