繁体   English   中英

在C中限制控制台输入长度:

[英]Limit Console Input Length in C:

我正开始为我正在上的课设计一个外壳应用程序,以便在Linux终端中运行。

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

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

假设,如果我将命令长度设置为3,则允许123 ,但是如果输入字符串中已经存在123 (在用户按下enter之前)并且用户尝试添加4 ,则不会在控制台上打印任何字符,甚至即使是“错误侦测”。

我意识到我可以设计这种功能,但是如果需要,我不确定从哪里开始做这种事情。

既可以使用现有的解决方案,也可以提供有关实施我自己的解决方案的建议。

编辑:

我想一种便宜又容易的解决方案是一次读取字符上的命令,直到到达输入信号或达到最大长度为止。 这种解决方案会出现问题吗?

控制台的这种低级控制不是C的基本内置I / O模型所包括的。

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

我对readline经验很少,但是您可以尝试以下操作:

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

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

如果不深入研究特定于平台的控件,您将无法限制在按下“ 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
   }
}

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

相反,我建议您避免这个问题,并接受一个码头是200万年前的一个愚蠢的痕迹。 大多数平台将LINE_MAX定义为任何程序需要处理的最大行大小。 除此之外,您可以简单地假设您的用户对您造成了困扰,并进行截断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM