2014-09-04 87 views
0

我正在寫一個C程序,應該添加每個數字,直到它達到一個標記值。然後把它們全部平均。如何解決分段錯誤?

林不知道問題出在哪裏,但我認爲這可能是數字永遠不會改變。任何幫助表示讚賞。

#include <stdio.h> 

int sentinal = 9999; 
int iterations = 0; 
int total = 0; 
int average; 
int num; 

int main(void){ 
do{ 
printf("Enter a number to add:\n"); 
scanf("%d\n", num); 
total = total + num; 
iterations++; 
}while (num != sentinal); 

average = total/iterations; 
printf("%d\n", average; 
return 0; 
} 

運行版本

#include <stdio.h> 

int main(){ 
int sentinel = 9999; 
int iterations = 0; 
int total = 0; 
float average; 
int num; 

while(1){ 
printf("\nEnter a number to add: "); 
scanf("%d", &num); 
if (num == sentinel){ 
    break; 
}else{ 
total = total + num; 
iterations++;} 
} 

average = (float) total/iterations; 
printf("%f\n", average; 
return 0; 
} 
+1

這個要求(參數'scanf'是by-address)完全是字面上庫函數存在的每個文本的每個初始示例。 [見此處的示例和文檔](http://en.cppreference.com/w/c/io/fscanf)。在解決這個問題的同時,可能會嘗試檢查結果以確保您的出參數被正確提取。 – WhozCraig 2014-09-04 00:51:51

+1

您將標記添加到您的總數並計算它。你可能不希望它成爲你的總和和平均值的一部分。 – vacawama 2014-09-04 00:52:54

+1

提示:打印'平均值'時檢查'scanf','printf'。 – user1336087 2014-09-04 01:05:08

回答

2

您的問題是在該行:

scanf("%d\n", num); 

scanf需要變量,其中應該把讀取的值的內存地址。這是通過運營商&完成的。您的代碼應該是:

scanf("%d\n", &num); 
1

scanf()將指針指向從標準輸入分析的值。您傳遞的是實際值,而不是指向值的指針。

1

Linux中有很多工具可以查找分割和其他編譯器。如果你想真正調試你的代碼出現分段錯誤的地方,你可以使用GDB和valgrind。它確實給你你的代碼有錯誤的地方。

1
  1. 當使用scanf存儲值時,提供地址,即&
  2. 聲明averagefloat,並在計算average時使用average = (float) total/iterations並使用%f而打印average
  3. 在打印時檢查您的printfaverage,右括號丟失。