Функция Readline в C выводит странные результаты - PullRequest
2 голосов
/ 02 декабря 2011

Я пытаюсь реализовать автозаполнение и историю в моей оболочке, используя библиотеку GNU Readline.Я использовал fgets() для извлечения пользователя и после прочтения о том, как работает функция readline, я решаю использовать ее для поддержки автоматического завершения и т. Д. Но когда я выполняю свою программу, функция readline выводит странные символыоболочка, прежде чем я даже ввести любой ввод.Странные результаты, такие как P�6, PJ� `, P� # , P�s`.По какой-то причине это всегда начинается с P. Вот мой код:

int main(int argc, char* argv[]) {

char *historic, userInput[1000];
static char **cmdArgv;/**The argv of the main*/

sa.sa_handler = handle_signal;
sigaction(SIGINT, &sa, NULL);
sa.sa_flags = SA_RESTART; /** Restart function incase it's interrupted by handler */
cmdArgv = malloc(sizeof (*cmdArgv));
welcomeScreen();//just printf's nothing special
while(TRUE)
{
    shellPrompt();// getcwd function
    historic = readline(userInput);
    if (!historic)
        break;
     //path autocompletion when tabulation hit
    rl_bind_key('\t', rl_complete);
     //adding the previous input into history
    add_history(historic);    
    if( check_syntax(userInput) == 0 ){
        createVariable(userInput);
    }

    else{
        tokenize(cmdArgv, userInput);
        special_chars(cmdArgv);
        executeCommands(cmdArgv, userInput);
    }
}

Есть идеи относительно проблемы?Спасибо.

1 Ответ

3 голосов
/ 02 декабря 2011

Инициализируйте userInput перед передачей его readLine():

memset(userInput, 0, sizeof(userInput));

Это описание аргумента, переданного функции readLine() (которую я нашел здесь man readline ):

Если аргумент равен NULL или пустой строке, приглашение не выдается.

Поскольку вы не инициализировали userInput, оно отображало то, что произошлотам.

...