2012-02-23 3 views
1

Хорошо, я уверен, что здесь кое-что отсутствует, но я понятия не имею, что это такое, и я надеюсь, что кто-то может помочь мне разобраться.Чтение ввода из fgetc() и печать с помощью printf()

Я читаю входные данные из командной строки и записываю функцию, которая использует fgetc() для этого. Однако, по-видимому, поверхностное изменение функции заставляет ее вести себя совершенно по-другому.

Это основной() функция:

while(1) 
{ 
    char* cmd = malloc(sizeof(char) * 80); 
    printf("Enter command: "); 
    read_flush(cmd, 80); 
    printf("%s\n", cmd); 
    free(cmd); 
} 

И это одна из версий read_flush():

int read_flush(char* buffer, int count) 
{ 
    int i, c; 
    for(i = 0; i < count; i++) 
    { 
     c = fgetc(stdin); 
     if(c == '\n' || c == EOF) 
      return i; 
     buffer[i] = (char)c; 
    } 

    return i; 
} 

Это один работает отлично. Вы вводите ввод, и он выплевывает его обратно. Однако эта следующая версия заставляет main просто печатать «Enter command:» снова и снова, не предоставляя пользователю возможность ввода ввода.

int read_flush(char* buffer, int count) 
{ 
    int i, c; 
    while(i < count)  
    { 
     c = fgetc(stdin); 
     if(c == '\n' || c == EOF) 
      return i; 
     buffer[i] = (char)c; 
     i++; 
    } 

    return i; 
} 

Какая утонченность с fgetc() я здесь отсутствует?

ответ

1

Попробуйте инициализировать i в вашей второй read_flush реализации.

+0

Ничего себе, кричит. Да, это было все, что было. – user1227489

+0

Хорошо иметь привычку всегда инициализировать свои переменные, особенно при работе с указателями. Это спасет вас от многих головных болей по дороге. –

1

Во второй версии похоже, что вы не инициализируете i до нуля, как в первой версии. Поэтому он может начинаться с значения мусора, большего, чем count, и поэтому цикл никогда не выполняется.

1

Обе версии имеют одинаковую ошибку. Вы не добавляете NUL в конец строки. malloc не инициализирует память, которую он возвращает.

+0

+1: Очень важный момент. –

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