Чтение ввода из fgetc () и печать с помощью printf () - PullRequest
1 голос
/ 23 февраля 2012

Хорошо, я уверен, что что-то здесь мне не хватает, но я понятия не имею, что это такое, и я надеюсь, что кто-то может помочь мне разобраться.

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

Это функция main ():

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 () мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

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

1 голос
/ 23 февраля 2012

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

1 голос
/ 23 февраля 2012

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

...