clrscr()不工作,getch()工作。 为什么?

我正在制作一个小型C程序,它要求输入密钥并在switch语句中执行一些代码。

 #include  #include  int main(int argc, char const *argv[]){ /* code */ printf("Hello, press a, b or c to continue"); char key = getch(); switch (key){ case 'a': clrscr(); //some code break; case 'b': //many lines of code break; case 'c': clrscr(); //many lines of code break; default: printf("Ok saliendo\n"); break; } printf("bye"); } 

getch()工作正常,但clrscr()不是,即使我包含

为什么?

conio.h死了!

一些背景知识: conio.h定义了一个用于控制IBM PC(text!)屏幕的API。 它最初只是MS-DOS函数的包装器,所以你不必编写自己的程序集来创建一个int 21h来调用它们。 conio.h的确切API从未标准化,并且因实现而异。

我假设您使用的是针对Windows的编译器,这些通常仍然提供了一些conio.h变体。 但是正如你所看到的,我们无法保证真正可用的东西能像你期望的那样工作。

如今,你甚至不得不问什么是屏幕? 控制台窗口的内容? 但是,如果你的控制终端是一个远程shell(telnet,ssh,…)怎么办? 甚至不同的控制台窗口实现也会在function和控制方式上有所不同。 C只知道输入和输出 ,它们可以与任何类型的终端/控制台一起使用,因为它们对屏幕一无所知,只是输入和输出字符。

为了实际控制“屏幕”,Windows提供了Console API ,您可以直接使用它,但是您的程序只能“硬连线”到Windows。 大多数其他控制台/终端都了解某种转义码 ,通常是ANSI转义码 。 从Windows 10开始的Windows也可以选择支持它们。 但是有各种各样的终端理解不同的代码(以及它们的不同子集),因此直接使用它们也不是一个好主意。


如今,控制终端/控制台的事实上的标准是Curses API ,它源于BSD Unix,但实现了各种各样的系统和控制台。 最值得注意的是, ncurses可用于许多系统,甚至包括Windows,但对于Windows,您也有pdcurses 。 甚至还有一个用于Windows的扩展pdcurses实现了自己的控制台窗口,因此您可以使用本机Windows控制台所没有的function。 当然,您不需要这个只是“清除屏幕”并从键盘读取一些输入。

当你使用curses ,你必须使用curses函数进行所有控制台/终端输入和输出(你不能使用像printf()那样的stdio函数)。 这是一个很小的示例程序:

 #include  // don't include `ncurses.h` here, so this program works with // different curses implementations #include  // for `isalnum()` int main(void) { initscr(); // initialize curses, this also "clears" the screen cbreak(); // among other things, disable buffering noecho(); // disable "echo" of characters from input addstr("Hello, press a key!\n"); // output a constant string, like puts/fputs refresh(); // output might be buffered, this forces copy to "screen" int c; do { c = getch(); // read a single character from keyboard } while (!isalnum(c)); // ignore any input that's not alphanumeric printw("You entered '%c'.\n", c); // formatted output, like printf addstr("press key to exit.\n"); refresh(); c = getch(); endwin(); // exit curses } 

您可以使用像这样的gcc编译它来使用ncurses

 gcc -std=c11 -Wall -Wextra -pedantic -ocursestest cursestest.c -lncurses 

或者使用pdcurses

 gcc -std=c11 -Wall -Wextra -pedantic -ocursestest cursestest.c -lpdcurses 

要了解有关curses更多信息,我建议使用NCURSES Programming HOWTO 。

clrscr()从不是任何标准的一部分。它是由borland在conio.h(非标准)中提供的供应商特定function。 尝试通过调用system(“cls”),包含stdlib.h头文件来模拟其行为。

我将平台相关函数clrscr()getch()更改为其对应的标准system()getchar()

 #include  #include  int main(int argc, char const *argv[]){ /* code */ printf("Hello, press a, b or c to continue:\n"); char key = getchar(); printf("\n"); switch (key){ case 'a': system("clear"); //some code break; case 'b': //many lines of code break; case 'c': system("clear"); //many lines of code break; default: printf("Ok saliendo\n"); break; } printf("bye\n"); } 

 gcc tc -ot 

它在我的机器上工作正常。

Linux ss 4.8.0-36-generic

gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609