2016-02-29 4 views
1

У меня в настоящее время проблема с заменой gets() на fgets(). Я рассмотрел несколько примеров этого, и это кажется очень прямым, однако я получаю неожиданный результат при этом. Используя метод gets() в комментариях ниже, я получаю хорошее поведение от своей программы оболочки, которую я пишу, однако, когда я перехожу к вызову fgets(), я получаю вывод «: нет такого файла или каталога» при подаче ввода «ls», , Как я уже сказал, с вызовом gets() он работает нормально. код ниже:C: ошибка замены gets() с помощью fgets()

int main(void) { 

    while(1) { 
    int i = 0; 
    printf("$shell: "); 

    scanf("%s", first); 
    /* gets(input);*/ 
    fgets(input, sizeof(input), stdin); 

    //...parse input into tokens for exec system call... 

    execvp(first, args); 

    } 
    return 0; 
} 

ответ

2

В отличие от gets, fgets будет читать строку и сохранить его в строке.

От человека страницы:

fgets() читает не более одного меньше, чем размер символы из потока и сохраняют их в буфер, на который указует с. Чтение останавливается после EOF или новой строки. Если прочитана новая строка, она хранится в буфере . A '\0' хранится после последнего символа в буфере .

Вы можете удалить символ новой строки (если он присутствует), заменив он будет нулевой байт:

fgets(input, sizeof(input), stdin); 
if (input[strlen(input)-1] == '\n') input[strlen(input)-1] = '\0'; 
+1

Альтернативный способ удаления символа новой строки: '{символ * п = strchr (вход,«\ п '); if (nl! = NULL) * nl = '\ 0'; } ' – MikeCAT

+1

' input [strlen (input) -1] 'будет считываться за пределы, если пустая строка была прочитана (это может произойти, если поток ввода исчерпан) –

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