2013-11-27 4 views
0

Я пытаюсь сделать свой собственный простой интерпретатор командной строки (shell), и я хочу, чтобы приглашение повторялось, если только пользовательский ввод является пробелом. По сути, если пользователь нажимает на возврат, я бы хотел, чтобы запрос повторил и дождался следующего ввода. Я использую fgets для ввода ввода и сохраняю его в char * commandBuffer для анализа методом parse(). Первоначально я думал проверить, существуют ли аргументы в argv (argc = 0), но это только приводит к тому, что курсор переместится на новую строку, не распечатывая подсказку еще раз. Если я буду вводить «\ n \ n \ ncd» в приглашении, например, cd все еще функционирует. Еще одна проблема, которую я хотел бы исправить, заключается в том, что для отправки того, что было напечатано в приглашении оболочки, пользователь должен нажать дважды. Вот мой код до сих пор:Как переиздать приглашение оболочки, если вводится только ввод пользователя?

for (;;) { 
     printf("p2: "); 
     fflush(stdout); 


     /*---------FGETS PROMPT----------*/ 
     fgets(commandLine, STORAGE, stdin); 
     ln = strlen(commandLine)-1; 
     /* Removes trailing newline */ 
     if(commandLine[ln] == '\n') 
      commandLine[ln] = '\0'; 
     /* ATTEMPT to repeat the prompt if only user input at prompt is enter*/ 
     if(commandLine[0] == '\0') 
      continue; 
....More shell code.... 
+0

Я тоже пытался реализовать свою консоль. Возможно, вы захотите попробовать 'libreadline' http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html Это сделает вашу жизнь намного проще. –

+0

Попробуйте проверить 'ln == 0' в вашем блоке if вместо проверки' commandLine [0] == '\ 0'' –

+0

@ronmrdechai: Это очень незначительная оптимизация и не приведет к каким-либо изменениям в функциональности. – anishsane

ответ

0

(до отлаживать): Я всегда делаю что-то вроде этого, чтобы выжить любое белое пространство, которое приходит вместе в команде. Это также позволяет избежать проблем, если вы получите \ r \ n \ 0 или просто \ r \ 0 в конце входящих строк, что вызовет проблемы с фрагментом кода.

char *cl; 
for (cl = commandLine; *cl && isspace(*cl); cp++) 
{ 
    if (cl == 0) 
     break;   // escape for (cl = ...) to get back to outer for (;;) 

    // if trimming trailing white space in the same style is important: 
    int ln;   // length of non-blank text 
    {      // limit scope of cl2 
    char *cl2; 
    for (cl = strchr(cl, '\0'); cl2 >= cl; cl2--) 
     if (isspace(*cl2)) 
      *cl2 = '\0'; 
    } 
    ln = cl2 - cl + 1; // we can quickly calculate 

    ... do the rest of your loop here using cP as your start of text 
}

*cl && isspace(*cl) немного паранойи осталось от столкновений с нарушенной isspace() вызывает в исторические времена.

Смежные вопросы