如何检查程序是否为空?

How do I check if the program cout is empty?

提问人:XI JING 提问时间:5/1/2022 最后编辑:XI JING 更新时间:5/1/2022 访问量:234

问:

我遇到了一个问题,我有一个 void 函数,它使用无序遍历打印出 AVL 树节点值。但是,如果 void 函数没有任何 cout,我还需要打印出“EMPTY”。
而且由于 void 函数是递归的,所以我假设 不能在函数内部(实际上我尝试过,但产生了很多不必要的 EMPTY)。
我的问题是,有没有办法检查程序/函数 cout,如下所示: if(cout is empty){ print “EMPTY” }
cout << "EMPTY" << endl;

void inorder(node* n){
    if(n != NULL){
        inorder(n->left);
        cout << n->value << ' ';
        inorder(n->right);
    }
}
C++ 递归 IOSTREAM COUT

评论

0赞 Community 5/1/2022
请提供足够的代码,以便其他人可以更好地理解或重现问题。
0赞 Retired Ninja 5/1/2022
听起来你应该向函数添加一个返回值,并使用它来决定要做什么。
1赞 David Schwartz 5/1/2022
我们需要查看您首次调用的位置,因为如果输出为空,则需要输出该位置。inorderEMPTY

答:

0赞 Jeremy Friesner 5/1/2022 #1

您无法查询它是否打印了某些内容。实际上有一个方法(tellp())可以返回 std::basic_ostream 流的位置(就是这样),但是当调用时总是返回 -1,可能是因为没有跟踪它打印的字符数(也就是它在输出流中的“位置”)。coutcoutcoutcout

因此,知道某些内容是否被打印的唯一实用方法是检测您的函数以通过返回值(正如 Retired Ninja 在评论中建议的那样)或通过其他机制(例如写入引用参数,或设置全局变量等)向调用者提供该信息inorder()

0赞 David Schwartz 5/1/2022 #2

当您调用 时,当且仅当其参数不是 时,它才保证产生一些输出。所以你可以这样做:inorderNULL

 void inorderTraverse(node* n)
 {
     if (n == NULL)
         std::cout << "EMPTY" << std::endl;
     else
         inorder(n);
 }

然后,无论您第一次打电话到哪里,都要打电话。inorderinorderTraverse

评论

0赞 Dúthomhas 5/1/2022
这将为所有子树打印“EMPTY”。
0赞 David Schwartz 5/2/2022
@Dúthomhas 我不明白你的意思。打印的代码永远不能在子树上调用,因为它不是函数的一部分。EMPTYinorder
0赞 Dúthomhas 5/2/2022
哎呀,你说得对,对不起,我误读了你的代码。您的解决方案与我的解决方案基本相同。
0赞 Dúthomhas 5/1/2022 #3

执行此操作的方法是具有两个函数:

  • 一个用户调用的,如果树是空的,它将打印“EMPTY”
  • 一个做其他一切的事情

执行此操作的常见方法是使用“detail”命名空间,但任何其他具有帮助程序函数的方法也可以:

namespace detail{
    void inorder(node* n){
        if(n != NULL){
            inorder(n->left);
            std::cout << n->value << ' ';
            inorder(n->right);
        }
    }
}

void inorder(node* n){
    if(n) detail::inorder(n);
    else std::cout << "EMPTY";
}

另一种常见的方法是使用一个额外的默认参数(在本例中为布尔值)来指示它是否是顶级调用:

void inorder(node* n, bool is_top=true){
    if (n != NULL){
        inorder(n->left, false);
        std::cout << n->value << ' ';
        inorder(n->right, false);
    }else if(is_top){
        std::cout << "EMPTY";
    }
}

不过,我个人不喜欢标志代码——帮助程序函数是一个古老的、可识别的习惯用语,它避免了每个叶节点的布尔测试的开销。