2013-10-29 13 views
0

我正在嘗試編寫一個程序,它將從用戶處獲取信息,用戶可以選擇要執行的操作。選項是添加,修改,刪除,顯示某些信息,查找平均值,然後退出。 我已經爲它們編寫了代碼,但無法使我的刪除功能正常工作。 這裏是我的代碼:當我使用「刪除」功能時,程序會掛斷

void delete_student(struct students *list, int *count)     //Delete's Selected student 
{ 
    int id4; 
    int k; 
    if (*count != 0) 
    { 
    printf("\nEnter the ID of the student you wish to delete: "); 
    scanf("%d\n", &id4); 
    for (int i = 0; i < *count; i++)    //Searches for the selected student 
    { 
     k = i; 
     if (list[i].id == id4) 
     { 
      printf("\nStudent found.\nDeleting...\n"); 
      for (int c = k; c < *count; c++)   //Deletes the student if found 
      { 
       list[c].id = list[c + 1].id; 
       strcpy(list[c].name, list[c + 1].name); 
       list[c].age = list[c + 1].age; 
       strcpy(list[c].dept, list[c + 1].dept); 
       list[c].grade = list[c + 1].grade; 
      } 
      *count = *count - 1; 
      printf("\nDeletion Complete.\n"); 
      break; 
     } 
     else 
      printf("\nStudent not found. Please try again.\n"); 
     break; 
    } 
} 
else 
    printf("\nNo student's to delete.\n"); 
} 

編輯: 當我經過的程序,我選擇使用此功能,它會問我的「ID」,然後什麼也不做,並具有眨眼光標。

有人能告訴我我做錯了什麼嗎? 有更多的代碼,如果你需要它。

請問這是怎麼的最後一個元素將被刪除:

list[*count].id = 0; 
strcpy(list[*count].name, NULL); 
list[*count].age = 0; 
strcpy(list[*count].dept, NULL); 
list[*count].grade = 0; 
+1

請說明爲什麼這不起作用。你是否收到編譯器錯誤?運行時出現分段錯誤?代碼是否運行,但不像它應該那樣運行? –

+0

@ZachStark當我瀏覽程序時,我選擇使用這個函數,它會問我「ID」,然後它什麼都不做,並且有一個閃爍的光標。 –

回答

1

您的scanf()語句的格式字符串不正確。您不需要添加尾隨的換行符; scanf照顧它。將該行更改爲scanf("%d", &id4);(不換行),它應該可以工作。
我剛剛寫了一個小的stub程序,它將scanf和newline進行比較,它會複製你的錯誤。

+0

這就是問題所在!非常感謝你! –

+0

但看看其他答案;你的代碼中還有其他一些問題。我碰巧找到了正確的。 –

1

您在您的for循環結束,可能不應該在那裏有一個break聲明。只要刪除那一個。

else 
     printf("\nStudent not found. Please try again.\n"); 
    break; 
} ^
     | 
     +------ this one 

printf也有點不準確;它會在循環的每一次迭代中打印出來,而您沒有發現匹配的ID。

+0

啊啊,謝謝你指出。你會建議我把它放在哪裏? –

+0

+1好。但是,這不應該導致程序掛起。另外,如果刪除結構中的最後一個元素,OP應該正確處理。 – Mahesh

+0

@Mahesh如果我刪除最後一個元素,我是否將所有值都更改爲NULL或0? –

1

這個循環:

for (int c = k; c < *count; c++) 

也許應該改爲:

for (int c = k; c < *count - 1; c++) 

書面,它讀取一個過去有效陣列的結束。結果是不確定的。尤其是,strcpy通話可能會非常糟糕。當它到達該循環中的最後一個條目時,list[c+1]引用不存在的條目(基於* count)。

0

你的scanf掛起,因爲它永遠不會讀你的電話號碼。沒有\n需要。僅限使用%d

相關問題