2016-02-05 67 views
1

接下來的三個代碼有什麼區別。關於Scanf的一些問題

1:

struct node 
{ 
    int data; 
}tree[100050]; 
/* 
some codes 
*/ 
int main() 
{ 
    int tot; 
    scanf("%d",&tot); 
    int tmp; 
    for(int i=0;i<=tot;++i){ 
     scanf("%d",&tmp); 
     tree[i].data=tmp; 
     insert(i,1); 
    } 
} 

錯誤答案

2:

struct node 
{ 
    int data; 
}tree[100050]; 
/* 
some codes 
*/ 
int main(){ 
    int n; 
    scanf("%d",&n); 
    int tmp; 
    for(int i=0;i<=n;++i){ 
     scanf("%d",&tree[i].data); 
     insert(i,1); 
    } 
} 

接受

3:

struct node 
{ 
    int data; 
}tree[100050]; 
/* 
some codes 
*/ 
int main() 
{ 
    int tot; 
    scanf("%d",&tot); 
    int tmp; 
    for(int i=0;i<=tot;++i){ 
     scanf("%d",&tmp); 
     tree[i].data=tmp; 
     insert(i,1); 
     tmp=0; 
    } 
} 

接受

第一個代碼不能通過所有測試,但接下來的兩個代碼可以通過所有測試。

問題是在這裏POJS024。它是用中文寫的。 輸入是構建二進制排序樹的數字列表,第一個數字是根。 輸出順序遍歷和後序遍歷

回答

5

所有這三者都使用錯誤的邏輯。你有在第二和第三的幸運,可能是因爲insert有等於0

值的一些特殊的處理在所有三個錯誤是,你正在使用

for(int i=0;i<=n;++i){ 

,而不是

for(int i=0;i<n;++i){ 
      ^^^ Needs to be < not <= 

如果您有代碼來檢查返回值scanf,那麼您將很快發現錯誤。

if (scanf(...) == 1) 
{ 
    insert(i,1); 
} 

這就是爲什麼你做檢查scanf系列函數的返回值的習慣,總是以確保您能夠讀取您期望的所有數據是非常重要的。

2

的問題(實際上在所有三種情況下某種意義上存在)則是調用scanf()太多次,因爲你使用的for循環,而不是使用<比較<=比較。因此最後致電scanf()實際上失敗。你應該再撥一次電話insert(i,1)

在示例1中,導致tree[i].data被設置爲讀入tmp的最後一個值,在示例2和3中,值保留爲零。很明顯,對insert(i,1)的額外呼叫在該特定情況下不會導致問題。