使用逗号代替" \ n"时省略控制台输出

时间:2015-07-20 14:50:04

标签: c printf newline

我无法解释自己以下奇怪的行为:

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

2 个答案:

答案 0 :(得分:3)

这里需要注意的是,标准输出是行缓冲的。当您在没有printf()的情况下调用newline时,要发送到标准输出的数据将被发送到输出缓冲区,但不会立即刷新到输出屏幕。

\n有助于立即将缓冲区刷新到输出屏幕

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

答案 1 :(得分:2)

stdout输出缓存在\n

打印最终\n或使用

禁用缓冲
setvbuf(stdout, NULL, _IONBF, 0);