C fgets问题

标签 c fgets

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 );
}

上面的变量“result”的目的是什么?什么也没做。从 fgets 返回的指针存储在其中,但就是这样,它没有任何用处。

最佳答案

您应该测试该结果是否为 NULL,以检查 EOF 条件或错误,而不是仅仅忽略它。此外,通过不检查结果,您正在在线执行 strlen,这可能具有未初始化的数据,因为 fgets 失败。真的,你应该在 fgets 之后:

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

如果第一个 fgets 成功而第二个失败,你可能仍然有泄漏,因为对结构的指针成员有额外的分配。不幸的是,由于该结构未初始化为零,因此您无法检查这些指针是否为 NULL。因此,或许使用 calloc 而不是 malloc 或至少将所有结构指针成员初始化为 NULL 会是一个更好的主意。

关于C fgets问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3926805/

相关文章:

linux - fgets 不以换行符终止

c - 之前存储的字符串会被 fget 覆盖

c - 停止fgets在C中转义 '\'(这样我就可以输入八进制形式的字符)

c++ - 使用 strcpy 时重复出现段错误

c++ - 如何判断当前进程是否打开了UI?

c - 在 C 中检测 EOF

c - 为什么我的代码之间的打印为零?

c - 如何为数组分配特定值?

c - 从字符串中提取字符串

c - 为什么这个 while 条件没有捕获 EOF?我遇到段错误