我开始设计一个shell应用程序,以便在我正在上课的 Linux 终端中运行。
当然,这将涉及从用户读取可变长度输入字符串(命令)。我知道我可以简单地将每个命令读入一个我认为合适的大小的缓冲区,但这有可能a)截断命令或b)导致缓冲区溢出。
如果可能,如何限制用户输入到控制台的长度?
假设,如果我将命令长度设置为3,则允许123
,但如果输入字符串中已存在123
(在用户按下回车之前)并且用户尝试添加4
,任何字符都不会打印到控制台,甚至可能会出现'错误ping'。
我意识到我可以设计这样的功能,但如果需要,我不知道从哪里开始做这样的事情。
非常感谢预先存在的解决方案或有关实施我自己的解决方案的建议。
修改
我想一个便宜而简单的解决方案是一次读取字符上的命令,直到达到输入信号或达到最大长度。这种解决方案会出现问题吗?
答案 0 :(得分:2)
这种对控制台的低级别控制并不包含在C的基本内置I / O模型中。
你需要研究特定于平台的东西,例如类似Unix的系统的ncurses。
答案 1 :(得分:2)
我对readline
没什么经验,但这是你可以尝试的:
rl_end
的函数(rl_line_buffer
中的字符数)
rl_getc
rl_ding
rl_getc_function
以按上述方式调用您的功能作为旁注,如果您使用readline
,则根本不需要限制输入(库可以随时管理其内存)。您可能感兴趣的另一个(更简单)函数是getline
。
答案 2 :(得分: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
}
}
答案 3 :(得分:0)
为了响应您的编辑,终端通常是行缓冲的,允许用户在点击输入之前尽可能多地输入,而您甚至不知道它。您可以将终端设置为原始或cbreak模式,但随后您将进入特定于平台的区域。
相反,我建议你避免这个问题,并接受终端是200万年前的愚蠢遗迹。大多数平台将LINE_MAX
定义为任何程序需要处理的最大行大小。除此之外,您可以简单地假设您的用户正在弄乱您,并截断。