我有過這種類型的經驗很多次:在遞歸函數中使用printf(),輸出是一個隨機數。但是,使用fflush(stdout)
修復了輸出。爲什麼會發生?示例:爲什麼printf()在遞歸函數中顯示異常行爲?
以下代碼是段樹實現。所述rangeQuery()函數返回在給定範圍內
node rangeQuery(node* tree, int root, int lml, int rml, int u, int v)
{
//query [u,v] where all descendants of root are in [lml,rml]
fflush(stdout); //<<<<------------------------------HERE
if (u<=lml && rml<=v)
return tree[root];
int m=(lml+rml)/2, lc=root*2, rc=root*2+1;
tree[root].split(tree,tree[lc],tree[rc]);
node l,r;
if (u <= m)
l = rangeQuery(tree, lc, lml, m, u, v);
if (v > m)
r = rangeQuery(tree, rc, m+1, rml, u, v);
tree[root].merge(tree,tree[lc],tree[rc]);
node res;
res.merge(tree, l, r);
return res;
}
int main()
{
//....
int opt,a,b;
scanf("%d%d%d",&opt,&a,&b);
a--;
b--;
node newNode;
newNode = rangeQuery(tree, 1, 1<<n, (1<<(n+1))-1, a+(1<<n), b+(1<<n));
printf("%d",newNode.val);
//....
}
最大元素的完整代碼可以在這裏找到:http://ideone.com/cTT0X3
正如上面可以看出,從rangeQuery除去fflush()()函數產生一個亂碼輸出,而使用fflush()會產生正確的輸出(3)。任何幫助表示讚賞。
該問題未能說明預期的結果和獲得的結果。問題描述只包含單個單詞「亂碼」,它是模糊不清的。 –
@DavidSchwartz好的,我會添加一些細節 – Ambar
@Ambar你不僅應該添加你期望的細節,還要把你的代碼降低到絕對必要的最小值。另一方面,這一方面太多的信息太少,另一方面太少。 – stefan