2015-07-20 189 views
2

我无法解释自己以下怪异的行为:控制台输出

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); 
} 
+4

输出到'stdout'禁用缓冲是*行缓冲,*,这意味着,一旦一个完整的行是要被打印的输出仅发送到控制台。尝试在打印后添加'fflush(stdout)',看看是否有问题。 – fuz

+0

发布的代码不会干净地编译。它提出了8个警告。这些警告需要修复。建议在启用所有警告的情况下进行编译。 (对于gcc,至少使用:'-Wall -Wextra -pedantic') – user3629249

+0

每个节点中有3个字段。发布的代码只是初始化前两个字段。 I.E.第三个字段包含垃圾,(可能不是NULL)。建议更正节点初始化语句。 main()函数的两个参数未被使用。建议将main声明为:'int main(void)'。为了避免垃圾回到操作系统,建议插入'return 0;'陈述在最后的大括号之前';}' – user3629249

回答

3

点到这里注意,标准输出为行缓冲。当您拨打printf()而没有newline时,要发送到标准输出的数据将被发送到输出缓冲区,但不会立即刷新到输出屏幕。

\n有助于平齐缓冲器到输出屏幕立即

或者,您可以使用fflush(stdout)手动刷新缓冲区。

+1

谢谢!这工作! – ndrizza

2

stdout输出缓冲在\n上。

无论打印最终\n

setvbuf(stdout, NULL, _IONBF, 0);