C/ c++:按下回车键后,光标是否能保持在当前行

C/C++ : Can I keep the cursor in the current line after pressing ENTER?

本文关键字:是否 光标 c++ 回车      更新时间:2023-10-16

我想问一下,按下ENTER键后,是否有办法保持光标在当前行!!

例如…

#include<stdio.h>
int main()
{
    int d=0;
    printf("Enter a number : ");
    scanf("%d",&d);
    if(d%2)printf(" is a Odd numbern");
    else printf(" is a Even numbern");
    return 0;
}

输出示例:

Enter a number : 10
 is a Even number

…但我需要的是这样的东西:

Enter a number : 10 is a Even number 

我想在用户

输入的数字旁边加上"is a偶数"(或"is a奇数")

用户正在按回车键,这将被回显并开始新的一行。

为了避免这种情况,您需要关闭echo(然后读取和回显除换行符以外的单个字符)。这是与系统相关的,例如在Linux上,您可以将tty设置为raw/uncooked模式。

您可以找到一个库,例如GNU readline,它可以为您完成大部分工作。

简单的回答是"你不能"。没有标准的c++函数来控制这种行为,或者在最后不按enter键的情况下读取数据(事实上,直到你按enter键,数据才真正被"输入",所以程序不会看到数据)。

您可以使用非标准的功能,例如额外的库,例如"curses"库或依赖于系统的代码,但是我们必须生成一次读取一个字符的代码,并使用您编写的代码将其合并在一起。

我建议您使用"在输出中重复输入",并简单地像这样做:

printf("%d is", d);
if (d%2)
    printf("an odd numbern");
else
    printf("an even numbern");

设置原始键盘模式,禁用规范模式。这几乎就是linux在终端中不显示密码字符的原因。

Termio结构是你应该谷歌的东西。

一个链接是:

http://asm.sourceforge.net/articles/rawkb.html

程序集的常量也可用于系统调用ioctl。

这个技巧可能会有帮助,如果你有一个vt100风格的终端:光标移动。

33为ESC, ESC + [ + A为上光标,ESC + [ + C为右光标

int main()
{
    int d=0;
    printf("Enter a number : ");
    fflush(stdout);
    scanf("%d",&d);
    printf("33[A33[18C%d is a an %s numbern", d, d%2 ? "odd" : "even");
    return 0;
}

not with printf and scanf…你试过getc()ungetc(char)吗?

或者,试着用printf("%c", (char)8);如果我没记错的话这是一个退格

否则,您可能不得不使用一些输出库,如ncurses