【问题标题】:How can I clear my screen before each loop iteration?如何在每次循环迭代之前清除屏幕?
【发布时间】:2015-04-09 13:18:08
【问题描述】:

如何在每次循环中清除屏幕?我的意思是我不想再次打印菜单。当我选择一个选项时,这将告诉我您想要重复或返回主菜单或退出。是否可以使用if/else 或者我必须为此使用switch

do
{
    cout << "\t **Manue**" << endl;
    cout << "1)   Print a Table " << endl;
    cout << "2)   Find the Prime Number " << endl;
    cout << "3)   Find the Factorial" << endl;
    cout << "4)   Exit Program " << endl;
    cout << "\nPlease select an option : ";
    cin >> option;
    if (option == 1)
    {
        int a, b;
        cout << "Enter the number that you want to have its table" << endl;
        cin >> a;
        for (int c = 1; c <= 10; c++)
        {
            b = c*a;
            cout << "The table is " << b << endl;
        }
    }
    else if (option == 2)
    {
        int num, flag = 0, i = 2;
        cout << "Enter the number that you want to check is a Prime or Not :" << endl;
        cin >> num;
        while (i < num)
        {
            if (num%i == 0)
            {
                flag = 1;
                break;
            }
            i = i + 1;
        }
        if (flag == 0)
            cout << "**Number is prime**\n" << endl;
        else
            cout << "\n**Number is not prime**\n" << endl;
    }
    else if (option == 3)
    {
        int i, fact = 1;
        cout << "Enter the number to find its Factorial" << endl;
        cin >> i;
        for (int n = i; n > 1; n--)
        {
            fact = fact *n;
            cout << fact << endl;

        }
    }
    else 
    {
        cout << "Invalid Option entered" << endl;
    }
    }
    while (option != 4);
    return 0;
}

【问题讨论】:

  • 您可以在 Windows 上使用 system("cls") 或在 Unix 上使用 system("clear") 作为快速破解。虽然不推荐。对于严肃的事情,你应该使用像 ncurses 这样的库。
  • 你的 do while 应该被终止为 (option) ,并在菜单中使其 0) 退出
  • ncurses 可能是矫枉过正。它占据了整个屏幕。 OP只想清除屏幕。 (就我个人而言,我认为这几乎总是一个坏主意;如果 your 程序清除了 my 屏幕,您可能正在擦除我不想擦除的信息。)
  • @KeithThompson:ncurses 的好处之一是,当程序退出时,您的屏幕将恢复到之前的内容(如 反对到此处发布的所有其他解决方案)。
  • 查看rlutil.h 在 Windows 和 Linux 中的可移植性。

标签: c++ c


【解决方案1】:

如果不使用隐藏终端可能特性的库,您将找不到可移植的方法。这就是为什么要编写像 curses 这样的库以及像 ncurses 这样的所有派生类的原因。

而且老年人还记得我们使用打印终端的时间,是的,就像带有串行接口的打字机:在键盘上输入的所有内容都进入计算机,写入的所有内容都进入......纸!没有希望清除那个菜单...

好吧,那些日子已经过去了,但不要指望在 Windows 下的 cmd.exe、类 Unix 系统的控制台以及任何终端仿真程序上都有一种简单的方法来清除屏幕。

所以你只有三个选择:

  • 严格可移植,只输出几行新行 - 没有清除,只有垂直间距
  • 减少便携性并尝试在不同系统上工作的\f(但不能保证在任何地方都可以使用)
  • 使用ncurses 派生库。

【讨论】:

  • 打印“几个”新行可能不起作用。我目前有一个 130 行高的窗口。 '\f' 通常不起作用(特别是,xterm 在看到换页符时不会清除屏幕)。 ncurses 可能是矫枉过正;它接管了屏幕,而 OP 显然只是想清除它。
【解决方案2】:

另一个简单的想法是,您可以使用system 命令并发出clear(或cls)以清除输出中的屏幕并呈现/刷新菜单的新状态。如果您想创建一些简单的东西,这不是一个坏主意,因为您不必阅读有关 ncurses 等的任何内容。此外,定义一个形式为

的常量
#define CLEARSCREEN system ( "cls" )

这样您就可以非常快速地在 cls/clear 之间切换。请注意,在 Windows 上,我认为这也需要库 process.h;也就是说,您还需要一份格式为

的声明
#include <process.h>

在顶部的某个地方。

【讨论】:

  • 我会把它写成一个函数,而不是一个宏。
  • 完全没问题。我只写了一个想法。
【解决方案3】:

Ncurses。

扩展 Serge 的答案,&lt;iostream&gt;std::cout 主要用于基于行的输出,没有“屏幕”的概念。如果你想提供一个菜单驱动的用户界面,提供选项,接受用户输入,并在循环中响应用户输入生成输出,你真的应该看看ncurses,它提供了这种功能.

许多平台都支持 Ncurses,并为许多不同的语言提供绑定。不过,对于一个简单的示例,我选择了“原始”C,它很容易在 C++ 代码中采用:

#include <ncurses.h>
#include <string.h>

#define LINELEN 50

int main()
{
    int c;
    char input[LINELEN];

    initscr();

    do {
        erase();
        mvprintw( 1, 1, "**Manue**\n" );
        mvprintw( 2, 1, "1) Print a Table\n" );
        mvprintw( 3, 1, "2) Find the Prime Number\n" );
        mvprintw( 4, 1, "3) Find the Factorial\n" );
        mvprintw( 5, 1, "4) Exit Program\n" );
        mvprintw( 7, 1, "Please select an option.\n" );
        refresh();

        getnstr( input, LINELEN );

        erase();
        mvprintw( 1, 1, "You entered: '%s'. (Press a key.)\n", input );
        refresh();

        int c = getch();
    } while ( strcmp( input, "4" ) );

    endwin();

    return 0;
}

从那里扩展应该很容易。关于 Keith Thompson 的评论,这还有一个额外的好处,即不会实际擦除用户的终端——一旦调用 endwin(),就会恢复以前的内容。

【讨论】:

    【解决方案4】:

    添加头文件

    #include < stdlib.h >
    

    并使用函数

    system("cls");
    

    您想清除屏幕的任何地方。

    【讨论】:

      【解决方案5】:

      在我看来,您不希望完全清除屏幕 - 正如您所写:

      有一个问题,当我第一次选择一个选项时,它会清除屏幕。没关系。但是当它显示一些结果时,它会再次自动显示菜单。我不想要。我希望在执行后程序向用户询问您要转到菜单。按此您要重复按此。退出按这个...

      我认为您可能在谈论子菜单:当用户在菜单中选择选项时,您想给用户一个选择:是再次执行相同的操作还是返回菜单。这是一个简单的菜单子菜单示例:

      #include <iostream>
      
      void print_main() {
          std::cout << "Main menu: [a, b, q (quit)]" << std::endl;
      }
      
      void print_submain() {
          std::cout << "Go back to main? [y/n]" << std::endl;
      }
      
      void submain() {
          char suboption;
          do {
              std::cout << "Do domething" << std::endl;
              print_submain();
              std::cin >> suboption;
          } while ( suboption != 'y');
      }
      
      int main() {
          char option;
          do {
              print_main();
              std::cin >> option;
              // it doesn't matter if switch or if-else is used
              switch(option) {
              case 'a':
                  submain();
                  break;
              case 'b':
                  submain();
                  break;
              default:
                  break;
              }
          } while (option != 'q');
          return 0;
      }
      

      你可以有不同的submain函数,做不同的事情,上面的例子用户可以根据需要执行它们,然后返回主菜单。

      【讨论】:

        【解决方案6】:

        system("cls"); 之前执行system("pause");。用户必须按 ENTER 或任意键才能返回菜单。

        【讨论】:

          【解决方案7】:

          在你的每次迭代中使用这个函数:-

          void clrscr()
          {
              system("@cls||clear");
          }
          

          【讨论】:

            【解决方案8】:
            cout << "\033[2J\033[1;1H";
            

            【讨论】:

            • 请花些时间让您的解释更彻底。虽然您发布的代码可能完美运行,但如果您先描述您的解决方案,其他社区成员从您的回答中受益会更有帮助
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-10-31
            • 1970-01-01
            • 1970-01-01
            • 2020-07-02
            • 1970-01-01
            • 2017-10-29
            • 2022-07-24
            相关资源
            最近更新 更多