我想知道如何在C中实现一个程序,它可以自动完成您在命令行输入的命令或文本。例如,假设您的程序提示用户输入文件名。大多数人会使用scanf()
或者其他人来做这件事。然后在命令行中,用户会像please input the file name:_
一样提示。
假设同一目录中有shakespeare.txt
。现在我已输入shakes
,然后我希望计算机为我自动完成shakespeare.txt
,就像用户点击Tab
时对大多数程序一样。如何实现?
修改:让其更清晰,另一个例子:
如果您在命令行中使用grep
,例如grep -i "shakespeare" shakespeare.txt
,在自己完成shakespeare.txt
之前,如果您只是使用Tab
,则会有一些候选人出现
当我尝试在使用scanf()
等函数时尝试提示用户输入时,如何实现我的程序以使其拥有此实用程序?
答案 0 :(得分:2)
如果您考虑使用现有的实用程序, 看看GNU readline library,它提供了一个非常巧妙的实施,你正在寻找什么 还有一些其他有用的功能,例如在输入中移动光标,提供输入历史记录和类似输入shell的提示。
此库的功能在不同平台上的工作方式相同。
如维基百科的this example所示,可以轻松设置指示完成的关键:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <readline/readline.h>
#include <readline/history.h>
int main()
{
char* input, shell_prompt[100];
// Configure readline to auto-complete paths when the tab key is hit.
rl_bind_key('\t', rl_complete);
for(;;) {
// Create prompt string from user name and current working directory.
snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024));
// Display prompt and read input (NB: input must be freed after use)...
input = readline(shell_prompt);
// Check for EOF.
if (!input)
break;
// Add input to history.
add_history(input);
// Do stuff...
// Free input.
free(input);
}
return 0;
}
答案 1 :(得分:0)
因为在C中没有便携式解决方案来知道你在promt中键入的内容而没有按Enter键,你需要逐个字符地阅读。
注意:您可能希望使用getche()来回显角色。
您将需要定义一个缓冲区,您将按字符逐个存储用户按下的所有内容,直到用户按Enter键或按Enter键。当你找到\ t时,你将分析缓冲区中的内容并根据它做出决定。
以下代码是一个过于简单的示例:
char c;
int i = 0;
do {
c = _getche();
if (c == '\t') {
// Autocomplete
// Print the rest of the word here
}
else {
buff[i++] = c;
}
} while (c != '\n' && c!='\r');
buff[i] = '\0'; // Let's keep the standard
答案 2 :(得分:0)
目前尚不清楚您是否要求完成
你的grep示例建议你询问shell的完成情况。 Here就是一个例子。