【问题标题】:Limit Console Input Length in C:限制 C 中的控制台输入长度:
【发布时间】:2012-02-29 16:56:11
【问题描述】:

我开始为我正在学习的课程设计一个在 Linux 终端中运行的 shell 应用程序。

当然,这将涉及从用户读取可变长度的输入字符串(命令)。我知道我可以简单地将每个命令读入一个我认为合适的大小的缓冲区,但这有可能 a) 截断命令或 b) 导致缓冲区溢出。

如果可能,如何限制用户输入到控制台的长度?

比如说,如果我将命令长度设置为 3,123 将被允许,但如果123 已经存在于输入字符串中(在用户按下回车之前)并且用户尝试添加4 ,任何字符都不会打印到控制台,甚至可能带有“错误 ping”。

我意识到我可以设计这样的功能,但如果需要,我不知道从哪里开始做这样的事情。

将不胜感激预先存在的解决方案或关于实施我自己的解决方案的建议。

编辑:

我想一个廉价而简单的解决方案是一次读取一个字符上的命令,直到达到输入信号或达到最大长度。这种解决方案会出现问题吗?

【问题讨论】:

    标签: c console io terminal


    【解决方案1】:

    这种对控制台的低级控制不包含在 C 相当基本的内置 I/O 模型中。

    您需要查看特定于平台的内容,例如用于类 Unix 系统的 ncurses

    【讨论】:

    • 感谢您的回答。我一直在寻找更多标准库或轻型自定义解决方案方法,因为我认为使用 ncurses 可能不适合我的任务,但我很欣赏这个建议。如果没有其他问题,我会接受这个作为答案。
    【解决方案2】:

    我对@9​​87654321@ 没有什么经验,但您可以尝试以下方法:

    • 写一个函数检查rl_endrl_line_buffer中的字符数)
      • 如果您想允许更多,只需返回rl_getc
      • 如果没有,可以使用rl_ding
    • 设置rl_getc_function 以如上所述调用您的函数

    附带说明,如果您确实使用readline,则根本不需要限制输入(库管理其内存)。您可能感兴趣的另一个(更简单的)函数是getline

    【讨论】:

    • 稍加调整后,我就可以很好地工作了。谢谢!这正是我所需要的。
    【解决方案3】:

    作为对您的编辑的响应,终端通常是行缓冲的,允许用户在您甚至不知道的情况下在按 Enter 之前输入任意数量的内容。您可以将终端设置为 raw 或 cbreak 模式,但随后您将进入特定于平台的领域。

    相反,我建议你避免这个问题,并接受终端是 200 万年前的愚蠢遗迹。大多数平台将LINE_MAX 定义为任何程序需要处理的最大行大小。除此之外,你可以简单地假设你的用户在惹你,然后截断。

    【讨论】:

      【解决方案4】:

      如果不深入研究特定于平台的控件,您就无法限制用户在点击“Enter”之前可以在控制台中输入多少个字符。

      可以做的是检查输入缓冲区中是否存在换行符;如果它不存在,那么用户输入的字符比您准备处理的字符多。您可以拒绝该输入,然后重复阅读stdin,直到看到换行符。

      例子:

       #include <stdio.h>
       #include <string.h>
       ...
       char buf[SIZE];
       ...
       printf("Gimme something: ");
       fflush(stdout);
      
       if (fgets(buf, sizeof buf, stdin))
       {
         char *newline = strchr(buf, '\n');
         if (!newline)
         {
           printf("Input too long: \"%s\"\n", buf);
           while (!newline && fgets(buf, sizeof buf, stdin))
             newline = strchr(buf, '\n');
         }
         else
         {
           // do something with buf
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-09-21
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        • 2015-04-08
        • 2014-04-14
        • 2011-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多