我有过这种类型的经验很多次:在递归函数中使用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