gpt4 book ai didi

c - 完成大写目录时 libreadline 出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:28:00 25 4
gpt4 key购买 nike

这是我正在创建的 shell 的一部分。我在使用 libreadline 时遇到了一些问题,因为当加载 shell 时我尝试使用自动完成(因此按 TAB)进入目录,在我按回车键后我访问了该目录但是在打印另一个提示之前我得到了一些奇怪的输出.我注意到只有当目录名称以大写字母开头时才会发生这种情况。

示例:“user::~ % cd Github” <-- 编写按下 tab 自动完成 Github

下一个提示是:“8b�/�user::Github %”我真的不明白为什么,这对我来说真的很奇怪。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
#include <signal.h>
#include <readline/history.h>
#include <readline/readline.h>
#include "flush.h"
#include "env.h"
#include "fget.h"

char * flush_builtins[] =
{
"cd",
"help",
"exit",
"ver",
"fget"
};

int flush_num_builtins() {
return sizeof(flush_builtins) / sizeof(char *);
}

int (*flush_func[]) (char **) =
{
&flush_cd,
&help,
&exit_flush,
&ver,
&fget
};

static int flush_startp(char **args)
{
pid_t pid;
int status;
pid = fork();
if (pid == 0)
{
if (execvp(args[0], args) == -1)
{
fprintf(stderr, "flush: command not found\n");
}
exit(1);
}
else if (pid < 0)
{
fprintf(stderr, "flush: command not found\n");
}
else
{
do
{
waitpid(pid, &status, WUNTRACED);
} while (!WIFEXITED(status) && !WIFSIGNALED(status));
}

return 1;
}

static int flush_exec(char **args)
{
int i;

if (args[0] == NULL)
{
return 1;
}

for (i = 0; i < flush_num_builtins(); i++)
{
if (strcmp(args[0], flush_builtins[i]) == 0) {
return (*flush_func[i])(args);
}
}

return flush_startp(args);
}

static char * flush_read(void)
{
fflush(stdout);
char *line_read = malloc(sizeof(char) * LINE_BUF);
char *prompt = malloc(sizeof(char) * LINE_BUF);
char *current, buffer[TOK_BUF];
current = getcwd(buffer, TOK_BUF);

strcat(prompt, get_user());
strcat(prompt, " :: ");

if (strcmp(current, get_home()) == 0)
{
strcat(prompt, "~");
}

else
{
strcat(prompt, get_cwd());
}

strcat(prompt, " % ");
line_read = readline(prompt);

if (line_read && *line_read)
{
add_history(line_read);
}

return line_read;
free(prompt);
free(line_read);
free(current);
}

static char **flush_getargs(char * line)
{
int bufsize = TOK_BUF;
int i = 0;
char **tokens = malloc(bufsize * sizeof(char *));
char **token;

if (!tokens)
{
fprintf(stderr, "allocation error\n");
exit(1);
}

token = strtok(line, DELIM);
while (token != NULL)
{
tokens[i] = token;
i++;
token = strtok(NULL, DELIM);
}

tokens[i] = NULL;
return tokens;
}


static void flush_loop(void)
{
char *line;
char **args;
int status;

do
{
line = flush_read();
args = flush_getargs(line);
status = flush_exec(args);
free(line);
free(args);
} while (status);
}

static void handler(int num)
{
signal(SIGINT, handler);
flush_loop();
fflush(stdout);
}

int main()
{
init();
signal(SIGINT, handler);
flush_loop();
return 0;
}

最佳答案

您不能将 strcat 与非 \0 终止的字符串一起使用:

char *prompt = malloc(sizeof(char) * LINE_BUF);
char *current, buffer[TOK_BUF];
current = getcwd(buffer, TOK_BUF);

strcat(prompt, get_user());

使用strcpy代替strcat,或者使用calloc代替malloc

关于c - 完成大写目录时 libreadline 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39580196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com