[英]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.