前几天,在GitHub上看到一个有趣的代码但是由于代码为作者九年前所发布的,所以发生了一些错误,其中一个错误就是clrscr函数的报错,当时我在网上找了好一阵,没有找到改错误的方法,于是我就在博客上求助,很幸运,不一会大神就为我解答了。经过更改后代码很好的走了起来,但是我不禁的思考,为什这样改?于是我就在网上找到了一些资料,希望可以和对大家有一些帮助。(声名:我的开发环境是DevC++)

对于clrscr函数在编译中出现问题的解决方法_clrscr函数的见解

其中的问题是没有声名函数clrscr函数,预算我就顺着这个思路去找这个函数在哪一个库里面,加一个什么样的头文件,思路有了,开始行动,百度走起。

      于是百度上说这函数在#include<conio.h>头文件中,可是我加上之后,却还无法运行。于是我便在博客上求助,不一会,就有大神就我的问题进行了回答,于是我便按照大神的做法进行了修改,通过宏定义将clrscr();改成了system("cls");,果然成功运行了,可是在欣喜之余,我不禁好奇,为什么这样做?于是我便在网上开始了查资料,于是在网络的帮助下,我的疑惑解开了,现在我很高兴能够和大家进行分享。

clrscr为clearscreen的缩写,为清屏函数,但是只可以在turbo c上运行,所以我的第一次的更改是错误的。在别的编译器上也是可以进行编译的,但是要进行变化也正是第二次我所更改的。网络上给出了三种改正的方法。

1、system("cls");//windows平台或 system("clear");//unix/Linux平台,再加#include<stdlib.h>头文件(若已经写过了或者想少敲字母可以在宏定义)

2.自己写函数,这种办法比较快。这是从微软MSDN得到的方法:

/* Standard error macro for reporting API errors */
#define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s \
on line %d\n", __FILE__, GetLastError(), api, __LINE__);}
void cls(HANDLE hConsole)
{
COORD coordScreen = {0, 0}; /* here's where we'll home the cursor */
BOOL bSuccess;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
DWORD dwConSize; /* number of character cells in the current buffer */
/* get the number of character cells in the current buffer */
bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);
PERR(bSuccess, "GetConsoleScreenBufferInfo");
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
/* fill the entire screen with blanks */
bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR) ' ',
dwConSize, coordScreen, &cCharsWritten);
PERR(bSuccess, "FillConsoleOutputCharacter");
/* get the current text attribute */
bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);
PERR(bSuccess, "ConsoleScreenBufferInfo");
/* now set the buffer's attributes accordingly */
bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes,
dwConSize, coordScreen, &cCharsWritten);
PERR(bSuccess, "FillConsoleOutputAttribute");
/* put the cursor at (0, 0) */
bSuccess = SetConsoleCursorPosition(hConsole, coordScreen);
PERR(bSuccess, "SetConsoleCursorPosition");
return;
}
或者
/*清屏函数*/
#include <stdio.h>
#include <windows.h>
#define PERR(bSuccess, api){if(!(bSuccess)) printf("%s:Error %d from %s on line %d\n", __FILE__,GetLastError(), api, __LINE__);}
void MyCls(HANDLE) ;
inline void clrscr(void)
{
HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
MyCls(hStdOut);
return;
}
void MyCls(HANDLE hConsole)
{
COORD coordScreen={0,0};//设置清屏后光标返回的屏幕左上角坐标
BOOL bSuccess;
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi;//保存缓冲区信息
DWORD dwConSize;//当前缓冲区可容纳的字符数
bSuccess=GetConsoleScreenBufferInfo(hConsole,&csbi);//获得缓冲区信息
PERR(bSuccess,"GetConsoleScreenBufferInfo");
dwConSize=csbi.dwSize.X * csbi.dwSize.Y;//缓冲区容纳字符数目
//用空格填充缓冲区
bSuccess=FillConsoleOutputCharacter(hConsole,(TCHAR)' ',dwConSize,coordScreen,&cCharsWritten);
PERR(bSuccess,"FillConsoleOutputCharacter");
bSuccess=GetConsoleScreenBufferInfo(hConsole,&csbi);//获得缓冲区信息
PERR(bSuccess,"ConsoleScreenBufferInfo");
//填充缓冲区属性
bSuccess=FillConsoleOutputAttribute(hConsole,csbi.wAttributes,dwConSize,coordScreen,&cCharsWritten);
PERR(bSuccess,"FillConsoleOutputAttribute");
//光标返回屏幕左上角坐标
bSuccess=SetConsoleCursorPosition(hConsole,coordScreen);
PERR(bSuccess,"SetConsoleCursorPosition");
return;
}
/*测试*/
int main()
{
printf("1111") ;
clrscr() ;
return 0;
}


若有什么错误欢迎大佬们指正!