c - GotoXY 没有像我预期的那样工作

标签 c console

GotoXY 无法工作,如果我将它可以工作的功能分开,但我需要将它们全部放在同一个文件中。

#include "colors.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define clear() printf("\033[H\033[J")



void gotoXY(int x, int y) {
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}



void welcome() {
    printf("%s", KRED);
    printf("  _       __________    __________  __  _________\n");
    printf(" | |     / / ____/ /   / ____/ __ \\/  |/  / ____/\n");
    printf(" | | /| / / __/ / /   / /   / / / / /|_/ / __/   \n");
    printf(" | |/ |/ / /___/ /___/ /___/ /_/ / /  / / /___   \n");
    printf(" |__/|__/_____/_____/\\____/\\____/_/  /_/_____/   \n");
    printf("                                                 \n");
    printf("\n\n%s", KGRN);
    sleep(3);
    clear();  
}

void menu_main_interface() {
    clear();
    printf("%s",KBLU);
    printf(" ___  ___  ___  _____ _   _   ___  ___ _____ _   _ _   _ \n");
    printf(" |  \\/  | / _ \\|_   _| \\ | |  |  \\/  ||  ___| \\ | | | | |\n");
    printf(" | .  . |/ /_\\ \\ | | |  \\| |  | .  . || |__ |  \\| | | | |\n");
    printf(" | |\\/| ||  _  | | | | . ` |  | |\\/| ||  __|| . ` | | | |\n");
    printf(" | |  | || | | |_| |_| |\\  |  | |  | || |___| |\\  | |_| |\n");
    printf(" \\_|  |_/\\_| |_/\\___/\\_| \\_/  \\_|  |_/\\____/\\_| \\_/\\___/ \n");
    printf("%s",KGRN);                                                       
    printf("\n\n ________________________________________________________\n |");                                                       
    printf("                                                      |\n");                    
    printf(" |                     1 ---> NEW GAME                  |\n"); 
    printf(" |                     2 ---> LOAD GAME                 |\n");                                                
    printf(" |                     3 ---> TOP 10 TIMES              |\n");
    printf(" |                                                      |\n");
    printf(" |                     0 ---> EXIT                      |\n");
    printf(" | ENTER OPTION:                                        |\n");
    printf(" |______________________________________________________|\n");
    gotoXY(16, 25); 
}


int main(int argc, char** argv) {

    printf("%s", KGRN);
    welcome();
    start();

    return (EXIT_SUCCESS);
}

并且 start() 函数仅调用 select_menu_interface() 导致:

void select_menu_interface() {
    int selection;

    do {
        menu_main_interface();
        readInt(&selection, 0, 3, "");
        switch (selection) {
            case 1: select_newgame(); break;
            case 2: break;
            case 3: readHS(); break;
            case 0: break;
            default: printf("ERROR: Bad Input!"); break;
        }
    } while (selection < 0 && selection > 3);

}

我希望光标位于“Enter Option:”,但它不起作用:光标位于另一行的开头:

enter image description here

最佳答案

查看您的代码,您似乎正在使用 ANSI terminal escape codes清除屏幕并设置颜色。由于 Windows 命令控制台默认不支持这些代码(ANSI.SYS 不再可用):

在第一种情况下,我们帮不了什么忙。但我已经测试了第二种情况:您在 gotoXY() 中的位置似乎与您向我们展示的屏幕布局不匹配:第一个参数是列,第二个是行。所以 gotoXY(16, 25) 会转到第 25 行(即屏幕上的第 26 行,因为位置从 0 开始)。那将至少比你的最后一行低 8 行(假设你的颜色序列不添加行)。为了获得正确的位置,我必须使用 gotoXY(23,15);

这种混淆可以解释滚动(如果第 25 行超出了垂直限制的窗口大小)。但是要使光标位于屏幕的开头,则需要水平位置超出窗口的水平尺寸(即至少 >57),而这里不是这种情况。

所以还有一些其他的可能性需要探索:

  • 因为 stdio 是缓冲的,所以在光标定位之前执行 fflush(stdout) 可能是安全的,以确保缓冲不会造成一些麻烦(例如要显示的尾随换行符稍后,例如当您使用其他 I/O 功能(如读取键盘)时。
  • 检查 readInt() 没有改变光标位置,例如,通过一个新行(我看到一个尾随的“”,所以我想该函数可以显示一些东西。

关于c - GotoXY 没有像我预期的那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40341712/

相关文章:

c# - 如何使用控制台隐藏样式运行 C# 控制台应用程序?

c# - 在 WPF 或控制台 C# 应用程序中接收 WM_COPYDATA 结构

C: 无法打开消息队列

c - 读写函数中的系统调用

c - CodeBlocks IDE制作的C语言程序,Windows下双击运行,Ubuntu上不行。为什么?

c - 使用 libav* 将 H.264 转码为 VP8 的帧速率不正确

Node.js 控制台异步应用程序 "best practice"

c# 在不停止应用程序的情况下读取用户输入

c++ - 将文件中的十六进制数转换为 ASCII

C# 'Unassigned local variable' ?