【问题标题】:using input function in C on linux, without pressing enter在Linux上使用C中的输入函数,无需按Enter
【发布时间】:2013-11-16 20:33:21
【问题描述】:

我在 Windows 上编写了一个代码,使用来自 stdio 的函数 getch()。问题是我必须使用不需要按回车的输入功能。

我的代码可以在 Windows 上编译并完美运行。但是,这个任务必须在 linux 上运行,当我尝试这样做时,它告诉我它无法识别 getch()(或 _getch())。 问题是根据分配,我不能使用其他包含但stdio.h(添加标志也是如此),所以我不能使用curses.h来解决这个问题。

termios.h之类的我也不能用,没学过。 我该如何解决这个问题?还有其他选择吗?

谢谢

【问题讨论】:

  • getchar() 函数可以检索单个字符,但在按下回车之前(默认情况下)它不会收到答案。您必须禁用缓冲才能超越该限制,但是您的问题表明您不允许这样做 - 这意味着您无法完成此任务。
  • 似乎答案是“无法完成”,但如果这是教授的任务,可能会有一些想法。也许粘贴说明,以便有人可以为您理解它们。
  • 我已经完成了很大一部分的作业,在使用getch功能并在windows上运行时,我只有linux的问题。指令说“从用户那里获取一个基数,(基数可以是 2-36 范围内的 int,当 a=10,b=11,...,z=35,类似于十六进制)。然后在这个基数,在任何两位数之间不输入(例如输入 - 基数>=17 中的 1g5)。"
  • 我读到的方式是一个输入行是“17 1g5”,另一个输入行是“16 ff”等等。每行之间都有一个输入。我不敢相信他们希望您获得无缓冲的输入。所以,阅读每一行,得到基数,然后得到数字。然后再找一行广告再做一次,直到没有更多的行。
  • 输入规则是这样的,我在一行中得到基数(从 2 到 36 的数字,这里没有问题),然后输入,所以我只使用 scanf。问题是之后,我得到了基础并输入,现在我必须得到未知数量的字符,它们之间没有输入。这是程序运行的示例:“ 28 /new line/ 3a2 /new line/ 2634 ” 第一行是基数,第二个数是基数,第三个是基数 10。

标签: c++ c linux getch


【解决方案1】:

UNIX 上的库方法对我们来说是ncurses,但它有点像一个框架,设置起来并不简单。非库模式是使用带有文件描述符0tcgetattr()tcsetattr() 将标准输入流转换为非规范 输入模式。从内存中输入必要的代码(即,我现在无法测试它,我可能忘记了一些重要的东西),相应的代码如下所示:

struct termios setings;
tcgetattr(0, &settings);
settings.c_lflags &= ~ICANON;
tcsetattr(0, &settings);

显然,真正的实现会验证系统调用是否确实成功。请注意,在此代码之后,std::cinstdin 将立即对按键做出反应。直接的结果是,所有类型的“有趣”角色都会通过。例如,当使用删除键时,您会看到退格字符(ctrl-H、char(7))出现。

【讨论】:

  • 我希望我能理解你写的一个词。我只是第一次诅咒,我们还没有学会“termios”。而且,正如我所说,我不能使用它。
  • 好吧,如果你不能使用<termio.h>(或者像ncurses这样的库包装器)你不会得到一个不等待回车键的设置!好吧,我认为你可以在 shell 上玩花样或从伪 tty 读取,但这些会比使用 tcgetattr()tcsetattr() 更棘手。
  • 顺便说一句,我购买“我还没学过”的论点完全!模数潜在的小错误可以通过简单的谷歌搜索来解决(如果有任何错误)我只是想如何使用这些功能! ...而且我可以向你保证,我在这里告诉别人的很多东西我从来没有“教过”,而是从任何来源找到的,无论是手册页、书籍等。
  • 好吧,我们没有学过'struct',也没有学过'pointers',而且你写代码的方式我也不熟悉,所以我无法真正理解那里发生了什么。跨度>
【解决方案2】:

我们不会在 Linux 中创造奇迹。您要么使用 stdio.h 之外的其他东西,要么不使用任何等效的 getch 并依赖于按下 Enter。

【讨论】:

  • 我知道这一点,但是分配输入规则需要像那样精确地获取字符。
  • 那么你的任务是不可能的。真的很抱歉。
  • @n.m.他们本可以在标准库中为此包含一个标准 C++ 函数,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2021-12-20
  • 2013-10-23
  • 2021-10-17
  • 2015-02-04
  • 2022-10-01
  • 1970-01-01
相关资源
最近更新 更多