2012-02-08 118 views
1

我开始设计一个shell应用程序,在我正在使用的类中的终端内运行。限制控制台输入长度为C:

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

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

说,如果我设置命令长度为3,123将被允许,但是如果123是在输入字符串中已经存在(用户已经按下之前输入),并且用户尝试添加4,没有字符将打印到控制台,甚至可能发生'错误ping'。我知道我可以设计这样的功能,但如果需要这样的功能,我不知道从哪里开始做这样的事情。

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

编辑:

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

回答

2

我有readline经验不多,但这里是你可以尝试什么:

  • 编写检查rl_end如果您希望让更多
    • (在rl_line_buffer的字符数)的函数,只需返回rl_getc
    • 如果没有,你可以使用rl_ding
  • 集T他rl_getc_function打电话给你的功能上面

描述作为一个侧面说明,如果你使用readline,你并不需要限制在所有的(因为它去图书馆管理它的内存)的输入。您可能感兴趣的另一个(更简单)功能是getline

+0

随着一点适应,我得到了这个工作相当好。谢谢!这是我需要的。 – 2012-02-08 20:35:35

2

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

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

+0

谢谢您的回答。我正在寻找更多的标准库或轻量级定制解决方案,因为我不认为使用ncurses可能适合我的任务,但我很欣赏这个建议。如果没有其他出现,我会接受这个答案。 – 2012-02-08 09:18:36

0

作为对您的编辑的回应,终端通常是行缓冲的,允许用户在打开输入之前尽可能多地输入内容,而您甚至不知道它。您可以将终端设置为raw或cbreak模式,但是您将进入平台特定的领域。

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

1

如果没有深入了解特定于平台的控件,您无法限制在使用“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 
    } 
}