我无法解释自己以下奇怪的行为:
在inOrder()
函数中,如果我写printf("%d\n", node->value)
(因此使用"\n"
),一切正常,程序会提供以下输出:
5
8
10
Printing Tree.
8,5,10,5
8
10
如果我写printf("%d,", node->value)
(因此仅使用" ,
"而不是" \n
")该程序仅向我提供以下输出。
5,8,10,Printing Tree.
正如您所看到的,树的值不会被打印出来,也不会在重复的inOrder遍历中打印出来。
您对此行为有解释吗?这是否与puts()
和printf()
在同一行上的合并使用有关? puts()
是否可以添加一个表示字符串结尾的字符?
(我使用Xcode)
这是完整的程序:
#include <stdio.h>
typedef struct Node Node;
struct Node
{
int value;
Node *left;
Node *right;
};
void printTree(Node *root)
{
puts("Printing Tree.");
printf("%d,", root->value);
printf("%d,", root->left->value);
printf("%d,", root->right->value);
}
void inOrder(Node *node)
{
if(node!=NULL)
{
inOrder(node->left);
printf("%d,", node->value);
inOrder(node->right);
}
}
int main(int argc, const char * argv[])
{
Node a = {10, NULL};
Node b = {5, NULL};
Node root = {8, &b, &a};
inOrder(&root);
printTree(&root);
inOrder(&root);
}
答案 0 :(得分:3)
这里需要注意的是,标准输出是行缓冲的。当您在没有printf()
的情况下调用newline
时,要发送到标准输出的数据将被发送到输出缓冲区,但不会立即刷新到输出屏幕。
\n
有助于立即将缓冲区刷新到输出屏幕。
或者,您可以使用fflush(stdout)
手动刷新缓冲区。
答案 1 :(得分:2)
stdout
输出缓存在\n
。
打印最终\n
或使用
setvbuf(stdout, NULL, _IONBF, 0);