【问题标题】:C/C++ : Can I keep the cursor in the current line after pressing ENTER?C/C++:按回车后我可以将光标保持在当前行吗?
【发布时间】:2013-05-24 17:31:00
【问题描述】:

请问有什么办法可以让光标在按回车后保持在当前行!!

例如...

#include<stdio.h>
int main()
{
    int d=0;
    printf("Enter a number : ");
    scanf("%d",&d);

    if(d%2)printf(" is a Odd number\n");
    else printf(" is a Even number\n");
    return 0;
}

输出示例:

Enter a number : 10
 is a Even number

...但我需要的是这样的:

Enter a number : 10 is a Even number 

我想在用户输入的数字旁边加上“是偶数”(或“是奇数”)

【问题讨论】:

  • 将您的tty 置于原始模式。 man ncurses。为大量工作做好准备。
  • 删除了c++ 标签。这是c
  • @BoBTFish:不要那样做。如果他使用的是 C++ 编译器,那么这是 C++。
  • @BoBTFish 它对 C++ 程序员也很有帮助,我正在使用 g++ 编译器...

标签: c++ c terminal


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    简单的答案是“你不能”。没有标准的 C++ 函数来控制这种行为,或者在最后不按 Enter 的情况下读取数据(事实上,在您按 Enter 之前,数据并没有真正“输入”,因此程序不会看到数据) .

    您可以使用非标准功能,例如附加库,例如“curses”库或系统相关代码,但我们必须生成代码以一次读取一个字符并使用代码将其合并在一起你写的。

    我建议您使用“在输出中重复输入”,然后简单地执行以下操作:

    printf("%d is", d);
    if (d%2)
        printf("an odd number\n");
    else
        printf("an even number\n");
    

    【讨论】:

      【解决方案3】:

      设置原始键盘模式并禁用规范模式。 差不多就是 linux 如何在终端中不显示密码字符了。

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

      一个链接是:

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

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

      【讨论】:

        【解决方案4】:

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

        \033 是 ESC,ESC + [ + A 是光标向上,ESC + [ + C 是光标向右

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

        【讨论】:

          【解决方案5】:

          不是printfscanf...你试过getc()ungetc(char) 吗?

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

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

          【讨论】:

          • -1,答案的前半部分行不通,不能退格“撤消”回车换行。
          • 我已经尝试过 gechar() 但不起作用......就像“@Mats Petersson”和“@Ben Voigt”所说的那样,没有任何标准功能可以做它...
          • 对不起,我误导了你...我记得我确实写了 (char)8 以在 mode3;int10h 中清除屏幕,但可能不适用于这里。由于无论如何我们都处于奇怪的状态,conio.h cprogramming.com/fod/kbhit.html 的 kbhit() 如果您的平台支持它(非标准)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-12
          • 1970-01-01
          • 2021-04-12
          • 1970-01-01
          • 2023-03-30
          相关资源
          最近更新 更多