C语言如何在控制台窗口设置光标到指定位置

在用C语言写控制台的程序时,说到控制光标,我们通常就是回车换行或者空格之类的进行移动光标控制,但是这类操作只能是将光标移动到当前光标后面的位置,而且效率极低

假设我们想要把光标移动到当前光标以前某个位置进行修改,我们通常的就是 system("cls")清屏,然后再重新打印到屏幕,这种操作方式虽然可以达到修改当前光标以前位置的效果,但是这种方法也是效率极低


其实在C中有专门的函数来实现 我们控制光标在屏幕指定位置的操作,在MSDN中我们可以找到这个函数


BOOL WINAPI SetConsoleCursorPosition( _In_ HANDLE hConsoleOutput, _In_ COORD dwCursorPosition );
SetConsoleCursorPosition函数有两个参数,前一个参数为 标准输出的 句柄


在这里可能我们不知道这个标准输出的句柄从哪来,在MSDN中也是有专门的函数来获取标准输出,标准输入,标准错误输出的句柄


而后一个参数COORD其实就是一个想包含x,y的一个类似于坐标的结构体
typedef struct _COORD {
  SHORT X;
  SHORT Y;
} COORD, *PCOORD;

通过这个函数我们就可以把光标设置到坐标为(X,Y)的地方
所以这里就有必要提到在控制台中X,Y构成的坐标

在这里的XY坐标系不同于我们数学中见到的直角坐标系,它是以左上角为坐标原点(0,0),x轴向右延伸,y轴向下延伸,以字符为单位

假如我们在一些项目中需要经常进行光标位置的设置,我们也可以自己打包写一个函数来达到光标控制的效果
static  void  SetPos( int  x ,  int  y )
{
       
        COORD  point = {  x ,  y  }; //光标要设置的位置x,y
        HANDLE  HOutput = GetStdHandle( STD_OUTPUT_HANDLE ); //使用GetStdHandle(STD_OUTPUT_HANDLE)来获取标准输出的句柄
       SetConsoleCursorPosition(HOutput, point); //设置光标位置
}
这样我们就得到了一个 SetPos 函数,我们只需要传入(x,y)就可以设置光标到指定位置