2013-11-25 3 views
1

Я пытаюсь создать программу на языке C, которая будет использоваться в качестве простого интерпретатора командной строки для системы UNIX. Я использую fgets() для чтения пользовательского ввода, который затем сохраняет входные данные в буфере для анализа. Если только вход пользователя вводится, я хотел бы переиздать приглашение. Есть ли способ определить, был ли ключ возврата единственным ключом, введенным в приглашении? Ниже приведен фрагмент кода, я пытался до сих пор:определение новой строки в fgets

for (;;) { 
    printf("$prompt$ "); 
    fflush(stdout); 

    fgets(commandBuffer, 200, stdin); 

    /* remove trailing newline:*/ 
    ln = strlen(commandLine) - 1; 
    if(commandLine[ln] == '\n') 
     commandLine[ln] = '\0'; 

    /* attempt to handle if user input is ONLY return key:*/ 
    if(commandLine[0] == '\n') 
     continue; 
+1

Для (редкого) случая 'fgets()', возвращающего строку нулевой длины, код будет терпеть неудачу. – alk

+0

Это можно исправить, проверив sizeof. – JFA

+0

@JFA Пожалуйста, расскажите, как помогает «проверка размера». – chux

ответ

2

Вы должны заменить

if(commandLine[0] == '\n') 

с

if(commandLine[0] == '\0') 

Код, чуть выше этого заменяет символ новой строки nuls.

1
ln = strlen(commandLine); 
while (ln > 0 && commandLine[ln-1] == '\n') 
    --ln; 
commandLine[ln] = '\0'; 

- это более компактное решение для обработки особых случаев, таких как пустой ввод.

0

ln должно быть типа size_t и определенно не должно быть ln = strlen(commandLine) - 1;. Существует ряд нечетных случаев, когда ln будет 0, а commandLine[ln-1] будет иметь доступ за пределами commandLine. Выполните \n несколько как @ensc.

Форма испытания, предложенного @simonc.

/* remove potential trailing newline */ 
size_t ln = strlen(commandLine); 
if (ln > 0 && commandLine[ln-1] == `\n`) { 
    commandLine[--ln] == '\0'; 
} 

/* attempt to handle if user input is ONLY return key:*/ 
if(commandLine[0] == '\0') 
    continue; 
Смежные вопросы