簡體   English   中英

關於Scanf的一些問題

[英]Some questions about 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。它是用中文編寫的。 輸入是一個數字列表,該列表將構建一個二進制排序樹,第一個數字是根。 輸出有序遍歷和后序遍歷。

所有這三個使用錯誤的邏輯。 您在第二個和第三個中很幸運,可能是因為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函數族的返回值的習慣,以確保您能夠讀取期望的所有數據,這一點非常重要。

問題(實際上在所有三種情況下都存在某種意義上)是因為您在for循環中使用<=比較而不是使用<比較,所以您多次調用scanf() 結果,最后一次對scanf()調用實際上失敗了。 並且您調用insert(i,1)時間比應調用的時間多。

在示例1中,導致tree[i].data設置為讀入tmp的最后一個值,在示例2和3中,該值保留為零。 顯然,在特定情況下insert(i,1)insert(i,1)的額外調用不會引起問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM