2013-04-09 71 views
0

我不知道發生了什麼,每當我在下面的代碼中輸入第二個字符串時,彈出一個錯誤框。我使用Codeblocks作爲編譯器。是因爲我使用指針指針嗎?字符串的氣泡排序功能導致程序崩潰

#include<stdio.h> 
#include<conio.h> 
void sort_string(char **) ; 
void main() 
{ 
    char *name[5] ; 
    int x =0; 
    printf("Enter Names"); 
    for(x = 0 ; x < 5 ; x++) 
    { fflush(stdin); 
     fgets(name[x], 100, stdin); 
    } 
    sort_string(name); 
    for(x = 0 ; x < 5 ; x++) 
    { 
     puts(name[x]); 

    } 


} 
void sort_string(char *name[5]) 
{ 
    char *temp; 
    int i , j ; 
    for (i = 4 ; i >=0; i--) 
    { 
     for (j = 0 ; j <=i; j ++ ) 
     { 
      if(strcmp(name[j] > name[j+1])) 
      { 
       temp = name[j+1]; 
       name[j+1] = name[j]; 
       name[j] = temp; 
      } 
     } 
    } 
} 
+1

'fflush(stdin);'是一個未定義的操作......你在哪裏分配內存來存儲你正在閱讀的這些字符串? – FatalError 2013-04-09 14:13:38

+0

name [x]是指針,需要分配內存。 – BLUEPIXY 2013-04-09 14:15:50

+0

能否請你在這個語句'strcmp(name [j]> name [j + 1])後面解釋你的目標,因爲這在語法上是不正確的。 – Ganesh 2013-04-09 14:19:49

回答

0

正如在問題的評論中指出的那樣,您需要爲name元素分配內存。一個簡單的方法是要注意,你硬編碼的名稱到99個字符(傳遞給fgets極限)和長度改變你的數組

char name[5][100]; 

一旦你這樣做,你的字符串比較是不太對。你可以改變

if (strcmp(name[j] > name[j+1])) 

if (strcmp(name[j], name[j+1]) > 0) 

這將顯示另一個bug。你的內循環可以運行到j=4。當您訪問name[j+1]時,您可以在陣列末尾讀取/寫入數據。最簡單的解決這裏將是改變內環退出一次迭代越早

for (j=0 ; j<i; j++) 
//   < rather than <= 
+0

謝謝我的prb被解僱了.. – 2013-04-09 14:29:36

+0

獲得的經驗:你不能盲目猜測C語法,然後通過試錯法找出類似程序的東西。程序員必須真正知道他們的代碼中的每一行實際上做了什麼。 – Lundin 2013-04-09 14:32:33

+0

@simonc ..雖然解決方案很好,但我不確定硬編碼的長度是一個好主意。最初的問題是針對一系列指針,我覺得解決方案應該包含一個'malloc'。 – Ganesh 2013-04-09 14:35:36

0

從代碼char *name[5]定義5字符數組的數組。因此,當您執行fgets(name[x], 100, stdin);時,由於name[x]是一個指針,因此預計內存分配給name[x]。因此,代碼可以修改

for(x = 0; x < 5; x++) 
{ 
    name[x] = malloc(sizeof(char) * 100); 
    fgets(name[x], 100, stdin); 
} 

編輯:

從這一變化

除此之外,你需要把在strcmp通過simonc建議的修改即條件變得if(strcmp(name[j], name[j+1]) > 0)和循環結構,它更改爲for (j = 0 ; j <i; j ++ )。除了上面的malloc以外的這2個修改,您的代碼將正常工作。

0

與fgets(名[X],100,標準輸入);

您正在將其複製到未分配的內存中。

char * name [5];

它只會創建大小爲5的字符指針數組。 您必須初始化該指針的值。

0

您沒有正確分配name[]。大多數現代語言都會爲你分配字符串和事物,但C是老派,你需要自己管理它。有幾種方法可以做到這一點。

char name[5][100]; 

此分配堆棧的本地2維陣列500個字節長上。 name[0]在分配開始時引用一個100個字符的數組。 name[1][3]是指第二個100字符緩衝區中的第四個字符,它是name中的第104個字節。 name[4]是最後的100個字符數組。

這裏,name是5個char *值,大概40個字節長的陣列。這些指針中的每一個都指向堆上的單獨100字節分配。您可以像上面的name[5][100]一樣引用它們中的緩衝區和字符,即使它是一個分配數組而不是一個2維數組。