我无法解释自己以下怪异的行为:控制台输出
在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);
}
输出到'stdout'禁用缓冲是*行缓冲,*,这意味着,一旦一个完整的行是要被打印的输出仅发送到控制台。尝试在打印后添加'fflush(stdout)',看看是否有问题。 – fuz
发布的代码不会干净地编译。它提出了8个警告。这些警告需要修复。建议在启用所有警告的情况下进行编译。 (对于gcc,至少使用:'-Wall -Wextra -pedantic') – user3629249
每个节点中有3个字段。发布的代码只是初始化前两个字段。 I.E.第三个字段包含垃圾,(可能不是NULL)。建议更正节点初始化语句。 main()函数的两个参数未被使用。建议将main声明为:'int main(void)'。为了避免垃圾回到操作系统,建议插入'return 0;'陈述在最后的大括号之前';}' – user3629249