如何在C语言中定位输入文本光标?

13

这里我有一个非常简单的程序:

 printf("Enter your number in the box below\n");
 scanf("%d",&number);
现在,我希望输出看起来像这样:
 Enter your number in the box below
 +-----------------+
 | |*|             |
 +-----------------+

|*| 是用户输入值的闪烁光标。

由于C是线性代码,它不会先输出框图,再要求输出结果,它会先输出顶行和左列,在输入后输出底行和右列。

因此,我的问题是,我是否可能首先打印出方框,然后让一个函数将光标带回方框中?


@SouravGhosh 好的,这个是否具有相对位移而不是绝对位移? - It'sRainingMen
1
这在标准C99中是不可能的。在一些操作系统上,你可以使用一些库,比如ncurses或者readline - Basile Starynkevitch
4个回答

38

如果你在一些Unix终端(xtermgnome-terminal ...)下运行,你可以使用控制台代码:

#include <stdio.h>

#define clear() printf("\033[H\033[J")
#define gotoxy(x,y) printf("\033[%d;%dH", (y), (x))

int main(void)
{
    int number;

    clear();
    printf(
        "Enter your number in the box below\n"
        "+-----------------+\n"
        "|                 |\n"
        "+-----------------+\n"
    );
    gotoxy(2, 3);
    scanf("%d", &number);
    return 0;
}

或者使用框线字符

printf(
    "Enter your number in the box below\n"
    "╔═════════════════╗\n"
    "║                 ║\n"
    "╚═════════════════╝\n"
);

更多信息:

man console_codes

4
请注意,#define gotoxy(x,y) printf("\033[%d;%dH", (x), (y))应该更改为#define gotoxy(x,y) printf("\033[%d;%dH", (y), (x))。您把x和y搞反了! - travisjayday

18
在Linux终端中,您可以使用终端命令移动光标,例如 printf("\033[8;5Hhello"); // 移动到 (8, 5) 并输出 hello 还有类似的命令:
printf("\033[XA"); // Move up X lines;
printf("\033[XB"); // Move down X lines;
printf("\033[XC"); // Move right X column;
printf("\033[XD"); // Move left X column;
printf("\033[2J"); // Clear screen

请记住,这不是标准解决方案,因此您的代码将不具备跨平台性。


2
+1 这是一个很棒的答案,它不仅解释了其他可以改变光标的命令,而且还超出了预期。我认为这应该是最佳答案,因为它既快速又有用。 - Nfagie Yansaneh
请注意,在您的第一条语句中(8,5)->第8行,第5列!花了我一分钟才弄清楚为什么我的程序没有按预期工作...无论如何,还是谢谢!+1 - travisjayday

1
#include <conio.h>

void main() {
    char d;
    cprintf("*---------*\n\r|         |\n\r*---------*");
    gotoxy(4,2);
    scanf("%c",&d);
}

这适用于所有操作系统


1

C语言本身没有屏幕和光标的概念。您需要使用提供此支持的某种库。 是终端控制最知名和广泛可用的库。


语言本身确实如此,但大多数控制台都有各种功能来实现这一点。而curses使用的转义序列就像其他已公开的序列一样。 - Alexis Wilke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接