2012-06-15 60 views
3

我嘗試使用此代碼從文件中讀取整數一行一行:請幫助糾正這個錯誤:使用的fscanf在C

int index = 0; 
int value; 
int IntegerArray[MAXARRAYSIZE]; 
while(fscanf(fp, "%d", &value) == 1){ 
    IntegerArray[index++] = value; 
} 

但我收到此錯誤:

Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_PROTECTION_FAILURE at address: 0x00000038 0x98a7c1ea in __svfscanf_l()

fp是鍵入FILE,我相信我已經使用了所有必需的庫包含。請幫忙。

+0

在發生崩潰時,你要做的第一件事就是在調試器中運行你的程序。它不僅可以幫助您確定崩潰的位置,還可以讓您檢查變量以查看可能導致崩潰的原因。 –

回答

2

您需要檢查index是否小於MAXARRAYSIZE。否則,你將會跳出界限並調用未定義的行爲(通常無效的內存訪問)。

變化

while(fscanf(fp, "%d", &value) == 1) 

while((1 == fscanf(fp, "%d", &value)) && (index < MAXARRAYSIZE)) 

不能存儲超過你所定義的數組大小的整數。

+0

自從Borland Turbo C於1990年發佈以來,編碼風格[integer literal] == [expression]已經過時。它對「可能的不正確賦值」發出了警告,並且從那時起每個編譯器都有這樣的警告。我不會鼓勵人們採用> 20歲的編碼風格技巧。 – Lundin

+0

@倫丁:人們一次又一次犯同樣的錯誤。新手往往會在條件內混淆'=='和'='。這有助於他們發現錯誤。只有經驗,你才能學會尊重編譯器的警告。 – dirkgently

+0

如果他們忽略編譯器警告,那麼他們應該得到這些錯誤。 – Lundin

1

你可能會超出你的maxrraysize,因爲你試圖訪問不屬於你的程序的內存,所以它可能是明智的檢查,也請初始化你的數組只是爲了安全,因爲它通常會保存之前在該位置上的值。

int index = 0; 
int value; 
int IntegerArray[MAXARRAYSIZE] = {0}; 

while(fscanf(fp, "%d", &value) == 1){ 
    if (index >= MAXARRAYSIZE) 
    { 
     printf("reached max array size!\n"); 
     break ; 
    } 
IntegerArray[index++] = value; 
}