C fgets вопрос - PullRequest
       3

C fgets вопрос

3 голосов
/ 13 октября 2010
struct DVDInfo  *ReadStruct( void ) {
    struct DVDInfo  *infoPtr;
    int             num;
    char            line[ kMaxLineLength ];
    char            *result;

    infoPtr = malloc( sizeof( struct DVDInfo ) );

    if ( NULL == infoPtr ) {
        printf( "Out of memory!!!  Goodbye!\n" );
        exit( 0 );
    }

    printf( "Enter DVD Title:  " );
    result = fgets( line, kMaxLineLength, stdin );
    line[ strlen( line ) - 1 ] = '\0';
    infoPtr->title = MallocAndCopy( line );

    printf( "Enter DVD comment:  " );
    result = fgets( line, kMaxLineLength, stdin );
    line[ strlen( line ) - 1 ] = '\0';
    infoPtr->comment = MallocAndCopy( line );

    do {
        printf( "Enter DVD Rating (1-10):  " );
        scanf( "%d", &num );
        Flush();
    }
    while ( ( num < 1 ) || ( num > 10 ) );

    infoPtr->rating = num;

    printf( "\n----------\n" );

    return( infoPtr );
}

Какова цель того, чтобы даже иметь переменную «результат» выше?С этим ничего не сделано.Указатель, возвращаемый из fgets, хранится в нем, но это не имеет смысла.

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Кажется, что кто-то запустил , чтобы реализовать проверку ошибок, но в конце концов провалил ееВозвращаемое значение следует сравнить с NULL, с сообщением об ошибке, если оно равно.

2 голосов
/ 13 октября 2010

Вы должны проверить этот результат на NULL, чтобы проверить состояние EOF или ошибку, а не просто игнорировать его.Кроме того, не проверяя результат, вы выполняете strlen on-line, который может иметь неинициализированные данные, потому что fgets потерпел неудачу.Действительно, после fgets вы должны иметь:

if (!result)
{
  free(infoPtr); // To not leak the object allocated at the start
  return NULL; // Function failed
}

У вас все еще могут быть утечки, если первый fgets завершается успешно, а второй завершается неудачей, поскольку имеется дополнительное распределение для элементов-указателей структуры.К сожалению, поскольку структура не была инициализирована нулем, вы не можете проверить эти указатели на NULL.Поэтому, возможно, было бы лучше использовать calloc вместо malloc или, по крайней мере, инициализировать все члены указателя структуры на NULL.

0 голосов
/ 13 октября 2010

Скорее всего, компилятор выдал предупреждение о возвращаемом значении функции, которое было проигнорировано. Программист не заботился о возвращаемом значении fgets и просто добавил в result =, чтобы компилятор перестал ворчать об этом. Правильным решением будет проверить возвращаемое значение, чтобы убедиться, что функция завершена успешно.

...