2016-12-19 2 views
-1

Я пытаюсь прочитать строку из stdin с помощью библиотеки Readline GNU. У меня две основные проблемы (я думаю): одна из них - PROMPT, а другая - обработка Crtl + D (которая должна выйти из мини-скорлупы, но вместо этого seg) Как я могу обработать Ctrl + D, чтобы он мог выйти ? Это код, где я использую Readline() функции:как обрабатывать Ctrl + D с помощью GNU Readline

char* readl(char* line){ 
    char* string=""; 
    char* pitos=""; 
    pitos=getenv("USER"); 
     strcat(pitos,PROMPT); 
     strcat(pitos," "); 
    while(strcmp(string,"")==0){ 


     //printf("%s%s ",getenv("USER"),PROMPT); 
     string = readline (pitos); 
    } 
    if(!string){ #trying to exit when ctrld 
     exit(0); 
    }else{ 
     char* com = strchr(string,'#'); #ignore comments 
     if(com!=NULL){ 
      *com=NULL; 
     } 
     add_history(string); 
     strcpy(line,string); 
     return string; 
    } 
} 
+1

Вы можете изменить таблицу окружения с помощью указателя из 'pitos = getenv (« USER »);'? Даже если память на указателе доступна для записи, откуда вы знаете, есть ли место для 'concat' на ее запись? Вы должны использовать 'putenv' для изменения переменной среды. –

+1

Почему вы изменили код? Нет необходимости аннулировать комментарии и ответы. Просто измените свой код, задайте другой вопрос, если у вас все еще есть проблемы. Лучше уходить и думать о вещах, чем пытаться заниматься учебным курсом в режиме реального времени. –

+0

Откинутый назад. Вы должны не менять свой вопрос, если это недействительно. Не стесняйтесь ** добавлять ** дополнительную информацию, но не меняйте соответствующие части существующего текста и соответствующим образом отмечайте изменения. – Olaf

ответ

0

Одна проблема, как представляется, что вы называете strcmp() на результате readline() перед тестированием на NULL.

Попробуйте это:

while(string && strcmp(string,"")==0){ 
    ... 
+0

Я обновил код, но CtrlD не работает. Он все еще неисправен – Januan

0
char* pitos=""; 
pitos=getenv("USER"); 
    strcat(pitos,PROMPT); 
    strcat(pitos," "); 

Существует только один доступный байт в строку, на которую указывает pitos (завершающего '\0'), и это неопределенное поведение, чтобы писать в него.